题目描述
黄小明和他的合伙人想要创办一所英语培训机构,注册的时候要填一张个人情况的表格,在身高一栏小明犯了愁。
身高要求精确到厘米,但小明实在太高了,无法在纸上填下这么长的数字。小明花钱买通了办事人员,于是只要写上他的身高模10007的结果就行了。
可小明不会取模,想起前几天请你帮他解决了水库的问题,于是又来找你帮忙。
输入输出格式
输入格式:
输入:(hehe.in)
小明的身高用A1^A2^...^An表示,第一行输入n,第二行输入n个正整数表示A1至An。
输出格式:
输出:(hehe.out)
一个数字表示小明身高mod 10007的值。
数据范围:
所有的0<=Ai<10000
第1~6数据点满足n=2
第7~10数据点满足n=3
第11个数据点满足n=1234567
(前六个数据会逐渐变大,照顾一下取模没弄清楚的同学。另外没有必要尝试对a1进行0或1的判断来骗分,估计是骗不到的。当然了,如果自认为运气好的人可以试试看,我
输入输出样例
说明
数据范围:
所有的0<=Ai<10000
第1~6数据点满足n=2
第7~10数据点满足n=3
第11个数据点满足n=1234567
(前六个数据会逐渐变大,照顾一下取模没弄清楚的同学。另外没有必要尝试对a1进行0或1的判断来骗分,估计是骗不到的。当然了,如果自认为运气好的人可以试试看,我也阻止不了你。)
思路:快速幂+欧拉函数(费马小定理)。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 10007 using namespace std; long long m,x,n; long long ans=1; long long pow(long long a,long long b){ long long s=1; for(;b;b>>=1){ if(b&1) s=s*a%mod; a=a*a%mod; } return s%mod; } int main(){ scanf("%lld%lld",&n,&m); for(int i=2;i<=n;i++){ scanf("%lld",&x); ans=ans*x; } cout<<pow(m,ans); }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 10007 using namespace std; int a[1234577]; int phi[10010],vis[10010],prime[10010]; int ans,tot,n; int pre(){ phi[1]=1; for(int i=2;i<=10010;i++){ if(!vis[i]){ prime[++tot]=i;phi[i]=i-1;} for(int j=1;i*prime[j]<=10010;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int pow(int a,int b,int p){ int s=1; for(;b;b>>=1){ if(b&1) s=s*a%p; a=a*a%p; } return s; } int modex(int k,int x){ if(x==n) return a[x]%k; int kt=modex(phi[k],x+1); int tt=pow(a[x],kt,k); return tt; } int main(){ pre(); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); ans=modex(mod,1); printf("%d",ans); }