1234:2011
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 763 通过数: 257
【题目描述】
已知长度最大为200位的正整数n,请求出2011n的后四位。
【输入】
第一行为一个正整数k,代表有k组数据(k≤200),接下来的k行,每行都有一个正整数n,n的位数≤200。
【输出】
每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0。
【输入样例】
3 5 28 792
【输出样例】
1051 81 5521
思路:首先n最大200位的,所以字符串输入
那么我们肯定要去处理这个n,分治算法的思想,要把这个问题最小化
怎么处理:我们猜想是不是有一个m,2011^m%10000是1,这个时候的m是不是就相当于0,那他的下一个(m+1)是不是余数就为2011,是不是相当于一个循环节呢?
我们找到这个数是500;当m=500时,余数为1
1000模500=0,所以最后的结果只和n的后三位有关,其他的mod500等于0了,我们求出n的后三位之后,还可以把n%500,当然,此时要说明,当n==0时,输出1;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int k;
int init()
{
char s[201];
cin>>s;
int l=strlen(s);
int a1=max(0,s[l-1]-48);
int a2=max(0,s[l-2]-48);
int a3=max(0,s[l-3]-48);
int n=a1+a2*10+a3*100;
//cout<<"a1="<<a1<<endl;
//cout<<"a2="<<a2<<endl;
//cout<<"a3="<<a3<<endl;
//cout<<"n="<<n<<endl;
return n%500;
}
int main()
{
cin>>k;
while(k!=0)
{
k--;
int n=init();
if(n==0)
{
cout<<1<<endl;
continue;
}
int c=2011;
int j=1;
do{
if(j*2<=n)
{
j*=2;
c=(c*c)%10000;//比如3的4次方等于9的平方
}
}while(j*2<=n);
for(;j<n;j++)
c=(c*2011)%10000;
cout<<c<<endl;
}
}