【OpenJudge】2991:2011



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:点击打开链接
一道裸裸快速幂加高精度,但只要求除法,于是来吧!


#include
#include
#include
#include
#include
#include
#include
#include
#include
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));
	}
}



你可能感兴趣的:(高精度)