【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=1408
【题意】
求m的所有约数中,满足可以分解成(奇数个不同素数/偶数个不同素数/其他)的所有的phi之和。
【思路】
ans1表示目前为止有偶数个奇质因子的欧拉函数的前缀和
ans2表示目前为止有奇数个奇质因子的欧拉函数的前缀和。
注意2不是奇质因子,需要去掉。
第三种可以由m-1减去前两种,减1为去掉1,1不是老师。
【代码】
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 5 const int N = 2e3+10; 6 const int MOD = 10000; 7 8 int pow(int a,int p,int mod) 9 { 10 int ans=1; 11 while(p) { 12 if(p&1) ans=(ans*a)%mod; 13 a=(a*a)%mod; p>>=1; 14 } 15 return ans; 16 } 17 18 int ans1,ans2,ans3,n,m,p,e; 19 20 int main() 21 { 22 scanf("%d",&n); 23 m=1; 24 for(int i=1;i<=n;i++) 25 { 26 scanf("%d%d",&p,&e); 27 m=(m*pow(p,e,MOD))%MOD; 28 if(p==2) continue; 29 int t1=(ans1+ans2*(p-1))%MOD; 30 int t2=(ans2+(ans1+1)*(p-1))%MOD; 31 ans1=t1,ans2=t2; 32 } 33 ans3=((m-1-ans1-ans2)%MOD+MOD)%MOD; 34 printf("%d %d %d ",ans1,ans2,ans3); 35 return 0; 36 }