給定你乙個數n,請你統計出在[a,b]這個區間中和n互質的數的個數。第一步:求出n的質因子:2,3,5;兩個數互質當且僅當他們除了1之外沒有其他的公共因子或者他們最大的公共因子是1。1和任何數是互素的
假設m=12,n=30.
第二步:(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 ...