JZYZOJ1378 [noi2002]M號機器人 歐拉函數
阿新 • • 發佈:2017-11-05
none lap ont get 快速冪 aps class targe const
http://172.20.6.3/Problem_Show.asp?id=1378
日常懶得看題目怪不得語文差,要好好讀題目了,歐拉函數大概是數論裏最友好的了,不用解方程不用轉換過來轉換過去只需要簡單乘在一起就可以了。
比較有趣的是求和的部分,因為類似於等比數列的性質,求全部的因數獨立值的和竟然只需要快速冪然後最後去掉一個沒有用的1(因為這個1是從頭到尾沒有乘上一個因數的)(具體見代碼),非常神奇
代碼
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5View Code#include<cmath> 6 using namespace std; 7 const int maxn=1010; 8 const int modn=10000; 9 long long k; 10 long long a[maxn]={},b[maxn]={}; 11 long long f[maxn][2]={}; 12 long long pow(long long x,long long y){ 13 long long z=1; 14 while(y){ 15 if(y&1){z*=x;z%=modn;} 16 y/=2;x*=x;x%=modn; 17 } 18 return z; 19 } 20 int main(){ 21 scanf("%I64d",&k); 22 int f1=0; 23 for(int i=1;i<=k;i++){ 24 scanf("%I64d%I64d",&a[i],&b[i]); 25 } 26 f[0][0]=1;int nex=0; 27 for(int i=1;i<=k;i++){ 28 if(a[i]==2)continue; 29 f[i][0]=f[nex][1]*(a[i]-1)+f[nex][0];f[i][0]%=modn; 30 f[i][1]=f[nex][0]*(a[i]-1)+f[nex][1];f[i][1]%=modn; 31 nex=i; 32 }long long cnt=1;f[k][0]-=1; 33 for(int i=1;i<=k;i++){ 34 cnt*=pow(a[i],b[i]);cnt%=modn; 35 }cnt-=1; 36 cnt=(cnt-f[k][0]-f[k][1]+2*modn)%modn; 37 printf("%I64d\n%I64d\n%I64d\n",f[k][0],f[k][1],cnt); 38 return 0; 39 }
JZYZOJ1378 [noi2002]M號機器人 歐拉函數