digits

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;
}
原文地址:https://www.cnblogs.com/xiaoningmeng/p/5794741.html