题面:3501
题解:欧拉函数的基础应用,再套个很 easy 的等差数列前 n 项和就成了。
啊,最近在补作业+准备月考+学数论,题就没怎么写,感觉菜得一匹>_<
CSL加油加油~!
代码:
1 #include<cstdio> 2 #include<cmath> 3 #define ll long long 4 #define mod(a) ((a)>=MOD?(a)%MOD:(a)) 5 using namespace std; 6 const ll MOD=1000000007; 7 ll N,sq,phi,n; 8 int main(){ 9 scanf("%lld",&N); 10 while(N){ 11 phi=N; 12 sq=sqrt(N); 13 n=N; 14 for(int i=2;i<=sq;i++){ 15 if(n%i==0){ 16 phi=mod(phi*(i-1)/i); 17 while(n%i==0) n/=i; 18 } 19 } 20 if(n>1) phi=mod(phi*(n-1)/n); 21 phi=mod(phi*N/2); 22 printf("%lld ",mod((1+N)*N/2-N-phi+MOD)); 23 scanf("%lld",&N); 24 } 25 return 0; 26 }
By:AlenaNuna