題意:求解小於n的數i且gcd(i,n)大於m的i的個數
分析:
對於所有小於n的最大公約數值一定是n的因子,所以,從這個方面下手找i為n的因子且i>m時求解車i的素數倍數且小於n的個數累加起來就好了。以為這個倍數最大為n/i所以求得n/i的歐拉函數值累加起來就好了。
代碼如下:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; long long euler(long long n){ //返回euler(n) long long res=n,a=n; for(long long i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先進行除法是為了防止中間數據的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; } //歐拉函數值 long long a[1000010]; int main(){ long long n,m; int t; cin>>t; while(t--){ long long ans=0; scanf("%I64d%I64d",&n,&m); for(int i=1;i*i<=n;i++){//判斷sqrt(n)就好 if(n%i!=0)continue; if(i>=m&&i*i!=n){ ans+=euler(n/i); } if(n/i>=m){ ans+=euler(i);//一個是i,一個是n/i
} } printf("%I64d\n",ans); } return 0; }
上一篇我們提到許多c的api,這一篇我們就來看看如何實現基本
本代碼提供對動態數組的支持,在內存中程序將數據
首先創建一個C++解決方案;其次在下面的選項裡面選擇win3
Solution to the n Queens Puz
很多計算機科學家認為排序是算法研究中最基礎的問題,不僅如此,
Hamming Code Time Limit: 1000