[BZOJ1408][Noi2002]Robot(数论+dp)
2017-03-02 18:37
288 查看
题目描述
传送门题解
独立数就是φ,然后老师就是约数所以实际上就是求
所有由偶数个奇素数组成的数的φ的和
所有由奇数个奇素数组成的数的φ的和
所有约数的φ的和减去前面两个答案
所有约数的φ的和用一个公式∑d|nφ(d)=n,不算1就是n-1
因为所有的数都是互质的,所以一个数的φ可以表示成所有素数的φ的积
然后f(i,1/2)表示前i个,选了奇数/偶数个质数的所有方案的φ的积的和,然后就可以转移了
代码
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define Mod 10000 #define N 1005 int k,m,e,st; int p ,f [3]; int fast_pow(int a,int p) { int ans=1; for (;p;p>>=1,a=a*a%Mod) if (p&1) ans=ans*a%Mod; return ans; } int main() { scanf("%d",&k);m=1; for (int i=1;i<=k;++i) { scanf("%d%d",&p[i],&e); m=m*fast_pow(p[i],e)%Mod; } if (p[1]==2) st=2; else st=1; f[st][1]=p[st]-1; for (int i=st+1;i<=k;++i) { f[i][1]=f[i-1][2]*(p[i]-1)+f[i-1][1]+p[i]-1; f[i][1]%=Mod; f[i][2]=f[i-1][1]*(p[i]-1)+f[i-1][2]; f[i][2]%=Mod; } m=((m-1-f[k][1]-f[k][2])%Mod+Mod)%Mod; printf("%d\n%d\n%d\n",f[k][2],f[k][1],m); }
相关文章推荐
- bzoj 1408: [Noi2002]Robot(数论+DP)
- BZOJ 1408 NOI2002 Robot 数论
- 【BZOJ 1408】【NOI 2002】Robot
- bzoj 1408: [Noi2002]Robot (DP+欧拉函数)
- bzoj 1408 [Noi2002]Robot(欧拉函数)
- BZOJ 1408: [Noi2002]Robot
- 【bzoj1408】 Noi2002—Robot
- BZOJ 1408: [Noi2002]Robot
- BZOJ_1408_[Noi2002]Robot_数学
- bzoj1408: [Noi2002]Robot
- 1408: [Noi2002]Robot|快速幂|欧拉函数
- bzoj1408 robot 数论
- 1408: [Noi2002]Robot 欧拉函数+快速幂
- 【bzoj1408】[Noi2002]Robot 数论+dp
- BZOJ1408:Robot(数论)
- BZOJ_P1407&Codevs_P1747 [NOI2002]Savage(数论+扩展欧几里得)
- BZOJ 1407: [Noi2002]Savage( 数论 )
- 【BZOJ1408】[Noi2002]Robot DP+数学
- bzoj1415 [Noi2005]聪聪和可可(期望概率DP+最短路)
- BZOJ 3209: 花神的数论题【数位dp】