解题思路
首先一个机器人m的独立数是而老师的数量就是他的因数数量-2,然后把M分解为
然后
=
之后
=
然后我们就可以发现政客的独立数就是在M的奇质因数中选择偶数个不同的乘起来的欧拉函数,军人就是选奇数个。然后学者就是M所以的独立数减去政客和军人。
选数我们可以用dp
表示在M因子中只包含前个的政客的欧拉函数
表示在M因子中只包含前个的政客的欧拉函数
然后进行动态转移
最后计算减去最后的政客独立数总和和军人独立数总和
#include<cstdio>
#define mods 10000
using namespace std;
int n,p,e,f[2][2],m=1;
int ksm(int x,int k)//快速幂
{
int ans=1;
while (k)
{
if (k&1) ans=(ans*x)%mods;
x=x*x%mods;
k/=2;
}
return ans;
}
int main()
{
scanf("%d",&n);
scanf("%d%d",&p,&e);
m=m*ksm(p,e)%mods;
if (p==2) f[1][0]=1;
else
{
f[0][0]=1;
f[1][0]=(f[0][0]+f[0][1]*(p-1)%mods)%mods;
f[1][1]=(f[0][1]+f[0][0]*(p-1)%mods)%mods;
}//初始化
for (int i=2;i<=n;i++)
{
scanf("%d%d",&p,&e);
m=m*ksm(p,e)%mods;
f[i&1][0]=(f[~-i&1][0]+f[~-i&1][1]*(p-1)%mods)%mods;
f[i&1][1]=(f[~-i&1][1]+f[~-i&1][0]*(p-1)%mods)%mods;
//动态转移
}
f[n&1][0]--;m=((m-1-f[n&1][0]-f[n&1][1])%mods+mods)%mods;//计算学者
printf("%d\n%d\n%d",f[n&1][0],f[n&1][1],m);
}