#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)//
佇列陣列實現容斥原理
}for(i=1;i)
sum+=m/p[i];
return
sum;
}intmain()
}
當r特別大的時候,時間效率會非常低下,那麼我們可以考慮容斥定理。容斥定理的思想:去求解原問題的逆問題−求區間[
1,r]中不與n互素的個數。
思路:首先求得n的所有素因子pi(i=1
...k), 通過二進位制列舉所有素因子的組合, 如果選取了奇數個素
因子,應該加上對應的個數,而如果是偶數, 則減去即可。
例如6既能2整除,也能被2∗3整除,所以應該剔除重複計數的部分(使用容斥定理)。
假設當前得到的素數組合是k, 那麼⌊rk⌋就是[
1,r]中能被k整除的數的個數。
詳細見容斥定理
詳細**如下
int solve(int r, int
n) }
if(n > 1) p.push_back(n); //
可能n也是素數
int sum = 0
;
for(int msk = 1; msk < (1
}int cur = r /mult;
if(bits & 1) sum +=cur;
else sum -=cur;
} return r -sum;
}
求區間(a,b)中與n的互質數
給定你乙個數n,請你統計出在 a,b 這個區間中和n互質的數的個數。兩個數互質當且僅當他們除了1之外沒有其他的公共因子或者他們最大的公共因子是1。1和任何數是互素的 假設m 12,n 30.第一步 求出n的質因子 2,3,5 第二步 1,m 中是n的因子的倍數當然就不互質了 2,4,6,8,10 n...
求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 ...