【OpenJudge】2991:2011

来源:互联网 发布:淘宝返利是什么意思 编辑:程序博客网 时间:2024/05/16 10:30


2991:2011


总时间限制: 
1000ms 
内存限制: 
65536kB
描述
已知长度最大为200位的正整数n,请求出2011^n的后四位。
输入
第一行为一个正整数k,代表有k组数据,k<=200接下来的k行,

每行都有一个正整数n,n的位数<=200
输出
每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0
样例输入
3528792
样例输出
1051815521

此题来源于openjudge:点击打开链接
一道裸裸快速幂加高精度,但只要求除法,于是来吧!
奋斗奋斗奋斗奋斗奋斗奋斗奋斗奋斗奋斗奋斗

<pre name="code" class="cpp">#include<cstdio>#include<iostream>#include<cstdlib>#include<cstring>#include<cmath>#include<queue>#include<stack>#include<algorithm>#include<time.h>using namespace std;#define MAXN 200#define MAXM #define MAXR #define INF 0x3f3f3f3f#define LL long long#define BIG 100000char s[MAXN*5+10];struct INT{LL date[MAXN+10];int len;INT(){memset(date,0,sizeof(date));len=0;}};INT operator / (const INT &a,const int &x){INT rn;LL res=0;for(int i=a.len;i>=1;--i){res*=BIG;rn.date[i]=(a.date[i]+res)/x;res=(a.date[i]+res)%x;}rn.len=a.len;while(!rn.date[rn.len]&&rn.len>=1)--rn.len;return rn;}void input(INT &a){scanf("%s",s+1);int len_input=strlen(s+1);int sum;for(int i=len_input;i>=1;){sum=0;for(int j=0,t=1;j<=4&&i>=1;j++,i--,t*=10)sum+=(s[i]-'0')*t;a.date[++a.len]=sum;}}void output(const INT &a){if(!a.len){putchar('0');return;}for(int i=a.len;i>=1;--i)printf("%I64d",a.date[i]);}int ksm(int a,INT p,int MOD){int rn=1;while(p.len){if(p.date[1]&1)rn=(rn*a)%MOD;a=(a*a)%MOD;p=p/2;}return rn;}int main(){int T;scanf("%d",&T);while(T--){INT N;input(N);printf("%d\n",ksm(2011,N,10000));}}



2 0
原创粉丝点击