jzoj1161-机器人M号【欧拉函数,dp】
正題
大意
因?yàn)轭}目比較gou,所以就直接放題目了
機(jī)器人1號(hào)可以制造其他的機(jī)器人。 第2秒,機(jī)器人1號(hào)造出了第一個(gè)機(jī)器人——機(jī)器人2號(hào)。 第3秒,機(jī)器人1號(hào)造出了另一個(gè)機(jī)器人——機(jī)器人3號(hào)。 之后每一秒,機(jī)器人1號(hào)都可以造出一個(gè)新的機(jī)器人。第m秒造出的機(jī)器人編號(hào)為m。我們可以稱它為機(jī)器人m號(hào),或者m號(hào)機(jī)器人。 機(jī)器人造出來后,馬上開始工作。m號(hào)機(jī)器人,每m秒會(huì)休息一次。比如3號(hào)機(jī)器人,會(huì)在第6,9,12,……秒休息,而其它時(shí)間都在工作。 機(jī)器人休息時(shí),它的記憶將會(huì)被移植到當(dāng)時(shí)出生的機(jī)器人的腦中。比如6號(hào)機(jī)器人出生時(shí),2,3號(hào)機(jī)器人正在休息,因此,6號(hào)機(jī)器人會(huì)收到第2,3號(hào)機(jī)器人的記憶副本。我們稱第2,3號(hào)機(jī)器人是6號(hào)機(jī)器人的老師。 如果兩個(gè)機(jī)器人沒有師徒關(guān)系,且沒有共同的老師,則稱這兩個(gè)機(jī)器人的知識(shí)是互相獨(dú)立的。注意:1號(hào)機(jī)器人與其他所有機(jī)器人的知識(shí)獨(dú)立(因?yàn)橹挥?號(hào)才會(huì)造機(jī)器人),它也不是任何機(jī)器人的老師。 一個(gè)機(jī)器人的獨(dú)立數(shù),是指所有編號(hào)比它小且與它知識(shí)互相獨(dú)立的機(jī)器人的個(gè)數(shù)。比如1號(hào)機(jī)器人的獨(dú)立數(shù)為0,2號(hào)機(jī)器人的獨(dú)立數(shù)為1(1號(hào)機(jī)器人與它知識(shí)互相獨(dú)立),6號(hào)機(jī)器人的獨(dú)立數(shù)為2(1,5號(hào)機(jī)器人與它知識(shí)互相獨(dú)立,2,3號(hào)機(jī)器人都是它的老師,而4號(hào)機(jī)器人與它有共同的老師——2號(hào)機(jī)器人)。 新造出來的機(jī)器人有3種不同的職業(yè)。對(duì)于編號(hào)為m的機(jī)器人,如果能把m分解成偶數(shù)個(gè)不同奇素?cái)?shù)的積,則它是政客,例如編號(hào)15;否則,如果m本身就是奇素?cái)?shù)或者能把m分解成奇數(shù)個(gè)不同奇素?cái)?shù)的積,則它是軍人,例如編號(hào) 3, 編號(hào)165。其它編號(hào)的機(jī)器人都是學(xué)者,例如編號(hào)2, 編號(hào)6, 編號(hào)9。 第m秒誕生的機(jī)器人m號(hào),想知道它和它的老師中,所有政客的獨(dú)立數(shù)之和,所有軍人的獨(dú)立數(shù)之和,以及所有學(xué)者的獨(dú)立數(shù)之和。可機(jī)器人m號(hào)忙于工作沒時(shí)間計(jì)算,你能夠幫助它嗎? 為了方便你的計(jì)算,Macsy已經(jīng)幫你做了m的素因子分解。為了輸出方便,只要求輸出總和除以10000的余數(shù)。
解題思路
首先一個(gè)機(jī)器人m的獨(dú)立數(shù)是φ(m)\varphi(m)φ(m)而老師的數(shù)量就是他的因數(shù)數(shù)量-2,然后把M分解為
p1e1×p2e2×p3e3...×pkekp1^{e1}\times p2^{e2}\times p3^{e3}...\times pk^{ek}p1e1×p2e2×p3e3...×pkek
然后
φ(m)=p1e1×p2e2...×pkek×(1?1p1)×(1?1p2)...×(1?1pk)\varphi(m)=p1^{e1}\times p2^{e2}...\times pk^{ek}\times (1-\frac{1}{p1})\times (1-\frac{1}{p2})...\times (1-\frac{1}{pk})φ(m)=p1e1×p2e2...×pkek×(1?p11?)×(1?p21?)...×(1?pk1?)
之后
φ(m)=(p1?1)p1e1?1×(p2?1)p2e2?1...×(pk?1)pkek?1\varphi(m)=(p1-1)p1^{e1-1}\times (p2-1)p2^{e2-1}...\times (pk-1)pk^{ek-1}φ(m)=(p1?1)p1e1?1×(p2?1)p2e2?1...×(pk?1)pkek?1
然后我們就可以發(fā)現(xiàn)政客的獨(dú)立數(shù)就是在M的奇質(zhì)因數(shù)中選擇偶數(shù)個(gè)不同的乘起來的歐拉函數(shù),軍人就是選奇數(shù)個(gè)。然后學(xué)者就是M所以的獨(dú)立數(shù)減去政客和軍人。
選數(shù)我們可以用dp
f[imod2][0]f[i\ mod\ 2][0]f[i?mod?2][0]表示在M因子中只包含前i個(gè)的政客的歐拉函數(shù)
f[imod2][1]f[i\ mod\ 2][1]f[i?mod?2][1]表示在M因子中只包含前i個(gè)的政客的歐拉函數(shù)
然后進(jìn)行動(dòng)態(tài)轉(zhuǎn)移
f[imod2][0]=f[(i+1)mod2][0]+f[(i+1)mod2][1]?(p?1)f[i\ mod\ 2][0]=f[(i+1)\ mod\ 2][0]+f[(i+1)\ mod\ 2][1]*(p-1)f[i?mod?2][0]=f[(i+1)?mod?2][0]+f[(i+1)?mod?2][1]?(p?1)
f[imod2][1]=f[(i+1)mod2][1]+f[(i+1)mod2][0]?(p?1)f[i\ mod\ 2][1]=f[(i+1)\ mod\ 2][1]+f[(i+1)\ mod\ 2][0]*(p-1)f[i?mod?2][1]=f[(i+1)?mod?2][1]+f[(i+1)?mod?2][0]?(p?1)
最后計(jì)算φ(m)\varphi(m)φ(m)減去最后的政客獨(dú)立數(shù)總和和軍人獨(dú)立數(shù)總和
代碼
#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;}//初始化(sro xjqのdalao orz)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;//動(dòng)態(tài)轉(zhuǎn)移}f[n&1][0]--;m=((m-1-f[n&1][0]-f[n&1][1])%mods+mods)%mods;//計(jì)算學(xué)者printf("%d\n%d\n%d",f[n&1][0],f[n&1][1],m); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的jzoj1161-机器人M号【欧拉函数,dp】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel中的字符串截取Excel中截取
- 下一篇: P1040,jzoj1167-加分二叉树