首先我們要會求1~m中與n不互質的數的個數。然後用b-(a-1)-(solve(b)-solve(a-1))即可。solve(b)是指1~b中與n不互質的數的個數。不互質就說明有公共的質因子。
那麼solve(b)怎麼求呢?先把n的質因子全都篩出來存在乙個vector陣列裡,然後用容斥原理求即可。
因為如果單把有和n的質因子相同的質因子的數算上的話,會有許多重複計算(比如乙個數的質因子有3的同時也可能有5),因此我們把有奇數個相同質因子的算作正項,偶數個質因子的算作負項(容斥原理)。比如在1~a中有x個數是3的倍數,y個數是5的倍數,z個數同時是3和5的倍數,那麼x和y就加上,z就減去。
怎麼列舉質因子的集合呢?我們用二進位制來表示乙個狀態,這個狀態代表了n中的某些質因子的組合。如果質因子的個數是奇數的話就作為正項,否則就是負項。用t表示這些質因子的乘積,1~b中有b/t個數是t的倍數。
#include using namespace std;
int num, y[1000000];
__int64 a,b,n;
void run(int x) //分解質因子
} if (x>1)
y[num++]=x;
}int solve(__int64 x)
} if (p & 1 ) ans+=x / t;
else ans-=x / t; }
return ans; }
int main()
return 0;
}
求 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的互質數
給定你乙個數n,請你統計出在 a,b 這個區間中和n互質的數的個數。兩個數互質當且僅當他們除了1之外沒有其他的公共因子或者他們最大的公共因子是1。1和任何數是互素的 假設m 12,n 30.第一步 求出n的質因子 2,3,5 第二步 1,m 中是n的因子的倍數當然就不互質了 2,4,6,8,10 n...
尤拉函式(求與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 ...