山东济南彤昌机械科技有限公司 山东济南江鹏工贸游有限公司

bzoj 1408 [Noi2002]Robot(欧拉函数)

 

【题目链接】

 

  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\n%d\n%d\n",ans1,ans2,ans3);
35     return 0;
36 }

 

posted on 2016-03-31 09:07  hahalidaxin  阅读(456)  评论(0编辑  收藏  举报