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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于bzoj 1408 [Noi2002]Robot(欧拉函数)的主要内容,如果未能解决你的问题,请参考以下文章

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

BZOJ_1408_[Noi2002]Robot_数学

BZOJ1408 NOI2002 Robot 快速幂+欧拉函数

1408: [Noi2002]Robot|快速幂|欧拉函数

BZOJ-1407: [Noi2002]Savage (扩展欧几里得)

bzoj1407 [Noi2002]Savage