JZYZOJ1378 [noi2002]M号机器人 欧拉函数


http://172.20.6.3/Problem_Show.asp?id=1378
日常懒得看题目怪不得语文差,要好好读题目了,欧拉函数大概是数论里最友好的了,不用解方程不用转换过来转换过去只需要简单乘在一起就可以了。
比较有趣的是求和的部分,因为类似于等比数列的性质,求全部的因数独立值的和竟然只需要快速幂然后最后去掉一个没有用的1(因为这个1是从头到尾没有乘上一个因数的)(具体见代码),非常神奇

代码

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm>  
 5 #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
%I64d
%I64d
",f[k][0],f[k][1],cnt);
38     return 0;
39 }
View Code
原文地址:https://www.cnblogs.com/137shoebills/p/7788117.html