您的位置:首页 > 运维架构

【OpenJudge】2991:2011 题解 抽屉原理

2016-07-04 14:31 429 查看


2011

时间限制: 1
Sec  内存限制: 128
MB

题目描述

已知长度最大为200位的正整数n,请求出2011^n的后四位。


输入

第一行为一个正整数k,代表有k组数据,k<=200接下来的k行,
每行都有一个正整数n,n的位数<=200


输出

每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0


样例输入

3
5
28
792


样例输出

1051
81
5521


这道题。。第一想法是高精度

这里观摩szp的高精度

然而楼主太懒不想写。。

于是再读读题发现只需要输出后四位

因此答案必然有一个最多5位数的循环节

于是就先写个暴力去找循环节

发现循环节长度为500,这个数就很好处理了

后面读入n时只保留后三位数

再mod500

就得出答案了,比写高精度简单多了~

(所以还是要仔细看题呀!)

下面贴代码

#include<cstdio>
#include<cstdlib>
#include<string.h>
bool v[10000];
int p[10000],cnt;
int main(){
int n;
long long c=2011;

while(1){
c%=10000;
if(v[c])break;
v[c]=true;
p[cnt++]=c;
c*=2011;
}

char input[300];
//printf("%d\n",cnt);
//cnt=500
scanf("%d",&n);
while(n--){
scanf("%s",input);
int len=strlen(input);
int a=input[len-1]-'0';
if(len>=2)a+=(input[len-2]-'0')*10;
if(len>=3)a+=(input[len-3]-'0')*100;
a--;
if(a==0){
printf("1\n");
continue;
}
a%=500;
printf("%d\n",p[a]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: