取余不只有90还有一个过不了
P1047 2011
描述
已知长度最大为200位的正整数n,请求出2011^n的后四位。
格式
输入格式
第一行为一个正整数k,代表有k组数据(k≤200),接下来的k行,每行都有一个正整数n,n的位数≤200。
输出格式
每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0。
样例
输入样例
3
5
28
792
输出样例
1051
81
5521
限制
时间限制: 1000 ms
内存限制: 65536 KB
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
char str[205];
int result(int n)
{
if(n==0)return 1;
if(n==1)return 2011;
int b=result(n/2)%10000;
b=(b*b)%10000;
if(n%2==1)b=(b*2011)%10000;
return b;
}
int pow(int n)
{
int result=1,base=2011;
while(n>=1)
{
if(n&1)result=result*base%10000;
base=base*base%10000;
n>>=1;
}
return result;
}
int main()
{
int k;
cin>>k;
while(k--)
{
int len=0,x=0;
memset(str,0,sizeof(str));
cin>>str;
len=strlen(str);
if(len==1)x=str[0]-'0';
else if(len==2)x=10*(str[0]-'0')+str[1]-'0';
else if(len==3)x=100*(str[0]-'0')+10*(str[1]-'0')+str[2]-'0';
else
{
for(int i=len-4; i<=len-1; i++)
{
//只读取最后4位数的值,把它转换为数字
x=x*10+(str[i]-'0');
}
}
//cout<<result(x)<<endl;
cout<<pow(x)<<endl;
}
return 0;
}
1046 取余运算
描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k×k为长整型数。
格式
输入格式
输入b,p,k的值。
输出格式
求b^p mod k的值。
样例
输入样例
2 10 9
输出样例
2^10 mod 9=7
限制
时间限制: 1000 ms
内存限制: 65536 KB
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
//使用快速幂
long long pow(long long x,long long y,long long mod)
{
long long ans=1,base=x%mod;//这个base是基础
while(y>=1) //快速幂的关键,p右移一位,相当于p除以2
{
if(y&1)
{
//如果y是奇数的话
ans=(ans*base)%mod;
}
base=(base*base)%mod;
y>>=1;
}
return ans;
}
int main()
{
long long b,p,k,sum;
cin>>b>>p>>k;
printf("%ld^%ld mod %ld=%ld\n",b,p,k,pow(b,p,k));
return 0;
}