您的位置:首页 > 其它

[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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: