2991:2011
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
- 已知长度最大为200位的正整数n,请求出2011^n的后四位。 输入
-
第一行为一个正整数k,代表有k组数据,k<=200接下来的k行,
每行都有一个正整数n,n的位数<=200
输出
- 每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0 样例输入
-
3 5 28 792
样例输出
-
1051 81 5521
此题来源于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 100000
char 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));
}
}