机器人M号
Description
3030年,Macsy正在火星部署一批機器人。 第1秒,他把機器人1號運到了火星,機器人1號可以制造其他的機器人。 第2秒,機器人1號造出了第一個機器人——機器人2號。 第3秒,機器人1號造出了另一個機器人——機器人3號。 之后每一秒,機器人1號都可以造出一個新的機器人。第m秒造出的機器人編號為m。我們可以稱它為機器人m號,或者m號機器人。 機器人造出來后,馬上開始工作。m號機器人,每m秒會休息一次。比如3號機器人,會在第6,9,12,……秒休息,而其它時間都在工作。 機器人休息時,它的記憶將會被移植到當時出生的機器人的腦中。比如6號機器人出生時,2,3號機器人正在休息,因此,6號機器人會收到第2,3號機器人的記憶副本。我們稱第2,3號機器人是6號機器人的老師。 如果兩個機器人沒有師徒關系,且沒有共同的老師,則稱這兩個機器人的知識是互相獨立的。注意:1號機器人與其他所有機器人的知識獨立(因為只有1號才會造機器人),它也不是任何機器人的老師。 一個機器人的獨立數,是指所有編號比它小且與它知識互相獨立的機器人的個數。比如1號機器人的獨立數為0,2號機器人的獨立數為1(1號機器人與它知識互相獨立),6號機器人的獨立數為2(1,5號機器人與它知識互相獨立,2,3號機器人都是它的老師,而4號機器人與它有共同的老師——2號機器人)。 新造出來的機器人有3種不同的職業。對于編號為m的機器人,如果能把m分解成偶數個不同奇素數的積,則它是政客,例如編號15;否則,如果m本身就是奇素數或者能把m分解成奇數個不同奇素數的積,則它是軍人,例如編號 3, 編號165。其它編號的機器人都是學者,例如編號2, 編號6, 編號9。 第m秒誕生的機器人m號,想知道它和它的老師中,所有政客的獨立數之和,所有軍人的獨立數之和,以及所有學者的獨立數之和??蓹C器人m號忙于工作沒時間計算,你能夠幫助它嗎? 為了方便你的計算,Macsy已經幫你做了m的素因子分解。為了輸出方便,只要求輸出總和除以10000的余數。
Input
輸入文件的第一行是一個正整數k(1<=k<=1000),k是m的不同的素因子個數。 以下k行,每行兩個整數,pi, ei,表示m的第i個素因子和它的指數(i = 1, 2, …, k)。p1, p2, …, pk是不同的素數。所有素因子按照從小到大排列,即p1 < p2<… < pk。輸入文件中,2<=pi<10,000, 1<=ei<=1,000,000。
Output
輸出文件包括三行。 第一行是機器人m號和它的老師中,所有政客的獨立數之和除以10000的余數。 第二行是機器人m號和它的老師中,所有軍人的獨立數之和除以10000的余數。 第三行是機器人m號和它的老師中,所有學者的獨立數之和除以10000的余數。
Sample Input
3
2 1
3 2
5 1
Sample Output
8
6
75
Data Constraint
Hint
樣例解釋: m=2*3^2*5=90。90號機器人有10個老師,加上它自己共11個。其中政客只有15號;軍人有3號和5號;學者有8個,它們的編號分別是:2,6,9,10,18,30,45,90。
.
.
.
.
.
.
分析
歐拉函數+快速冪
梳理一下題目意思:
①獨立數是小于等于的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
.
.
.
.
.
程序:
#include<iostream> using namespace std; int k,c[1001][2],f[1001],ans2=0,ans3=0,ans1=1,g,mod=10000; int work(int x,int y) {int ans1=1;while (y){if (y%2) ans1=(ans1*x)%mod;y/=2;x=(x*x)%mod;}return ans1; } int main() {cin>>k;for (int i=1;i<=k;i++) cin>>c[i][0]>>c[i][1];if (c[1][0]==2) g=2; else g=1;f[0]=1;for (int i=g;i<=k;i++)for (int j=i-g+1;j>=1;j--)f[j]=(f[j]+f[j-1]*(c[i][0]-1))%mod;for (int i=1;i<=k-g+1;i++)if (i%2) ans2=(ans2+f[i])%mod; else ans3=(ans3+f[i])%mod;for (int i=1;i<=k;i++) ans1=(ans1*work(c[i][0],c[i][1]))%mod;ans1=(ans1+10000000-ans2-ans3-1)%mod;cout<<ans3<<endl;cout<<ans2<<endl;cout<<ans1<<endl;return 0; }轉載于:https://www.cnblogs.com/YYC-0304/p/9499933.html
總結
- 上一篇: 体育场[带权并查集]
- 下一篇: 【NOI2013模拟】棋盘游戏