求區間(a,b)中與n的互質數

2021-07-11 12:03:32 字數 924 閱讀 1005

給定你乙個數n,請你統計出在[a,b]這個區間中和n互質的數的個數。

兩個數互質當且僅當他們除了1之外沒有其他的公共因子或者他們最大的公共因子是1。1和任何數是互素的

假設m=12,n=30.

第一步:求出n的質因子:2,3,5;

第二步:(1,m)中是n的因子的倍數當然就不互質了(2,4,6,8,10)->n/2 6個,(3,6,9,12)->n/3 4個,(5,10)->n/5 2個。

如果是粗心的同學就把它們全部加起來就是:6+4+2=12個了,那你就大錯特錯了,裡面明顯出現了重複的,我們現在要處理的就是如何去掉那些重複的了!

第三步:這裡就需要用到容斥原理了,公式就是:n/2+n/3+n/5-n/(2*3)-n/(2*5)-n/(3*5)+n/(2*3*5).

第四步:我們該如何實現呢?我在網上看到有幾種實現方法:dfs(深搜),佇列陣列,位運算三種方法都可以!上述公式有乙個特點:n除以奇數個數相乘的時候是加,n除以偶數個數相乘的時候是減。我這裡就寫下用佇列陣列如何實現吧:我們可以把第乙個元素設為-1然後具體看**如何實現吧!

#include 

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int n=100005;

vector

v;ll re(ll x)else

} return ans;

}int main()}}

if(n!=1)

//coutcout

<}

}

求 a, b 區間內與n互質的個數

include include include include using namespace std long long s 1020 k void prime long long m 求乙個數的素因子 if m 1 s k m printf n long long quc long long m...

求a b中與n互質的數的個數

首先我們要會求1 m中與n不互質的數的個數。然後用b a 1 solve b solve a 1 即可。solve b 是指1 b中與n不互質的數的個數。不互質就說明有公共的質因子。那麼solve b 怎麼求呢?先把n的質因子全都篩出來存在乙個vector陣列裡,然後用容斥原理求即可。因為如果單把有...

尤拉函式(求與n互質的數的個數)

求解與n 1 n 1 互質的質因子的個數 注釋 解析 定義 對於正整數 n,n 是小於或等於 n的正整數中,與 n互質的數的數目。例如 8 4,因為1,3 5,7 均和8互質。性質 1.若 p是質數,p p 1.2.若n是質數p的 k次冪,n p 1 p k 1 因為除了 p的倍數都與 n互質 p ...