51nod1244 欧拉函数之和 杜教筛
生活随笔
收集整理的這篇文章主要介紹了
51nod1244 欧拉函数之和 杜教筛
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
和上一題差不多,一個是μ*I=e,一個是φ*I=Id
稍改就得到了這題的代碼
(我會告訴你我一開始逆元算錯了嗎)
1 #include <bits/stdc++.h> 2 #define MAX 5000000 3 #define MOD 1000000007 4 using namespace std; 5 long long a,b,N; 6 long long phi[MAX+1],p[MAX],ans[MAX]; 7 bool bo[MAX+1]; 8 long long work(long long n) 9 { 10 if(n<=MAX) return phi[n]; 11 if(ans[N/n]) return ans[N/n]; 12 long long ret=n%MOD*(n+1)%MOD*500000004%MOD; 13 for(long long j=2;j<=n;) 14 { 15 long long nex=n/(n/j); 16 ret=(ret-(nex-j+1)%MOD*work(n/j)%MOD+MOD)%MOD; 17 j=nex+1; 18 } 19 ans[N/n]=ret; 20 return ret; 21 } 22 int main() 23 { 24 int sum=0;phi[1]=1; 25 for(int i=2;i<=MAX;i++) 26 { 27 if(!bo[i]) 28 p[++sum]=i,phi[i]=i-1; 29 for(int j=1;j<=sum && p[j]*i<=MAX;j++) 30 { 31 bo[p[j]*i]=1; 32 phi[i*p[j]]=phi[i]*((i%p[j])?phi[p[j]]:p[j]); 33 if(i%p[j]==0) break; 34 } 35 } 36 for(int i=2;i<=MAX;i++) 37 phi[i]=(phi[i]+phi[i-1])%MOD; 38 scanf("%lld",&a); 39 N=a; 40 printf("%lld\n",work(a)); 41 return 0; 42 }?
轉載于:https://www.cnblogs.com/wanglichao/p/6837902.html
總結
以上是生活随笔為你收集整理的51nod1244 欧拉函数之和 杜教筛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暖心留言短句精选249个
- 下一篇: android-DNS服务找不到