数字

【题目描述】

给一个关于x的多项式,并给定一个x,求该多项式在带入该x时的值最后k位数字。

【输入描述】

第一行两个整数n、k;

之后的n行,每行两个数ai和bi,表示多项式的一项ai*x^bi;

最后一行一个整数x。

【输出描述】

输出k行,按顺序输出该多项式带入x后值的最后k位数字,若不足k位,则高位补零。

【输入样例】

2 1

3 2

1 5

3

【输出样例】

0

【数据范围及提示】

对于100%的数据,1 <= n <= 100000,1 <= ai,bi,x <= 10^9,1 <= k <= 8。

 

#include<cstdio>
#include<iostream>
#define N 100100
using namespace std;
int n,k,ki=1,x,cnt=0;
long long ans;
int a[N],b[N],an[10];
long long ksm(long long p,long long q)
{
    long long sum=1;
    while (p>0)
      {
           if (p%2) sum=sum*q%ki;
           q=q%ki*q%ki;
           p/=2;
      }
    return sum;
}
void print()
{
    while (ans>0)
      {
           an[++cnt]=ans%10;
           ans/=10;
      }
    if (cnt<k)
      {
          for (int i=1;i<=k-cnt;i++)
            printf("0\n");
      }
    for (int i=cnt;i>=1;i--)
      printf("%d\n",an[i]);
}
int main()
{
  freopen("digits.in","r",stdin);
  freopen("digits.out","w",stdout);
  scanf("%d%d",&n,&k);
  for (int i=1;i<=k;i++) ki*=10;
  for (int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
  scanf("%d",&x);
  for (int i=1;i<=n;i++) ans=(ans+ksm(b[i],x)*a[i]%ki)%ki;
  print();
  fclose(stdin);
  fclose(stdout);
  return 0;    
}

 

posted @ 2016-08-22 08:37  外婆桥  阅读(226)  评论(0编辑  收藏  举报