Digits
(digits.cpp/c/pas)
Description
给一个关于x的多项式,并给定一个x,求该多项式在带入该x时的值最后k位数字。
Input
第一行两个整数n、k;
之后的 行,每行两个数ai和bi,表示多项式的一项 aix^bi;
最后一行一个整数x。
Output
输出k行,按顺序输出该多项式带入x后值的最后k位数字,若不足k位,则高位补零。
Example
digits.in
2 1
3 2
1 5
3
digits.out
0
附加样例见选手目录下『digits』文件夹。
Hint
对于30%的数据,n,k,ai,bi<=3,x<=10 ;
对于100%的数据,1<=n<=100000,1<=ai,bi,x<=10^9,1<=k<=8。
【题目分析】
快速幂取模,一定要随时!随时!随时%%%!
/* 评测机上我只有40分,然而我把每一组数据都代入输出,与nancheng58(评测100分)的输出一毛一样!!!为什么评测机给我40!!!我感受到了来自世界深深的恶意! */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; long long x,a[100010],b[100010],sum=0,mod=1,ch,yy; int n,k,an[10]; long long ksm(long long a,long long p) { long long ans=1; for(;p;p>>=1,a=(a*a)%mod)//here. if(p&1) ans=ans%mod*a%mod; return ans; } int main() { freopen("digits10.in","r",stdin); freopen("digits.out","w",stdout); scanf("%lld%d",&n,&k); for(int i=1;i<=k;i++) mod=mod*10; for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]); scanf("%lld",&x); for(int i=1;i<=n;i++) { ch=ksm(x%mod,b[i]); yy=(ch%mod)*(a[i]%mod); sum=(sum%mod+(yy%mod))%mod; } an[8]=sum/10000000; an[7]=sum/1000000%10; an[6]=sum/100000%10; an[5]=sum/10000%10; an[4]=sum/1000%10; an[3]=sum/100%10; an[2]=sum/10%10; an[1]=sum%10; for(int i=k;i>=1;i--) printf("%d ",an[i]); fclose(stdin);fclose(stdout); return 0; } //下面附上nancheng58满分代码(郁闷!) #include<iostream> #include<cstdio> #define MAXN 100001 #define LL long long using namespace std; LL n,k,a[MAXN],b[MAXN],mod,m,lim,ans,c[14]; LL read() { LL x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar(); return x*f; } LL mi(LL x,LL y) { LL tot=1; while(y) { if(y&1) tot=(tot*x)%mod; x=(x*x)%mod; y>>=1; } return tot; } int main() { freopen("digits10.in","r",stdin); freopen("digits.out","w",stdout); n=read(),mod=read(); lim=m=mod;mod=1; while(m--) mod*=10; for(int i=1;i<=n;i++) a[i]=read()%mod,b[i]=read(); k=read(); k%=mod; for(int i=1;i<=n;i++) { ans=(ans+a[i]*mi(k,b[i])%mod)%mod; } for(int i=lim;i>=1;i--) { c[i]=ans%10; ans/=10; } for(int i=1;i<=lim;i++) printf("%d ",c[i]); fclose(stdin);fclose(stdout); return 0; }