题解
- 梳理一下题目意思:
- ①独立数时小于等于的m与互质的数(包括1)
- ②一个数的老师是这个数的因数(不包括1)
- ③政客:对于一个数x,如果x可以转换为偶数个不同的素因子的积
- ④军人:对于一个数x,如果x可以转换为奇数个不同的素因子的积
- ⑤学者:对于m的老师x,如果x既不是政客又不是军人,那它就是学者
- 对于一个数的独立数其实就是它的欧拉函数和
- 设f[i]为m的所有大于2的质因数中的选择i个质因数的欧拉函数和
- 那么政客的独立数就是∑f[i]且(i%2==0)
- 军人的独立数就是∑f[i]且(i%2==1)
- 那么考虑学者的独立数和怎么求?
- 这又要用到欧拉函数的一个性质:n=∑d|nϕ(d)
- m的所有的约数的欧拉函数之和为m
- 也就是说学者的独立数和:m-军人-政客-1
代码
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 using namespace std;
6 const int mod=10000;
7 int k,c[1010][2],f[1010],ans1=0,ans2=0,ans=1,g;
8 int mi(int a,int b)
9 {
10 int ans=1;
11 while (b)
12 {
13 if (b%2) ans=(ans*a)%mod;
14 b/=2;
15 a=(a*a)%mod;
16 }
17 return ans;
18 }
19 int main()
20 {
21 scanf("%d",&k);
22 for (int i=1;i<=k;i++) scanf("%d%d",&c[i][0],&c[i][1]);
23 if (c[1][0]==2) g=2; else g=1;
24 f[0]=1;
25 for (int i=g;i<=k;i++)
26 for (int j=i-g+1;j>=1;j--)
27 f[j]=(f[j]+f[j-1]*(c[i][0]-1))%mod;
28 for (int i=1;i<=k-g+1;i++)
29 if (i%2) ans1=(ans1+f[i])%mod; else ans2=(ans2+f[i])%mod;
30 for (int i=1;i<=k;i++) ans=(ans*mi(c[i][0],c[i][1]))%mod;
31 ans=(ans+10000000-ans1-ans2-1)%mod;
32 printf("%d
%d
%d
",ans2,ans1,ans);
33 return 0;
34 }