题目描述
题解
独立数就是
φ
,然后老师就是约数
所以实际上就是求
所有由偶数个奇素数组成的数的
φ
的和
所有由奇数个奇素数组成的数的
φ
的和
所有约数的
φ
的和减去前面两个答案
所有约数的
φ
的和用一个公式
∑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[N],f[N][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);
}