本文共 933 字,大约阅读时间需要 3 分钟。
已知长度最大为200位的正整数n,请求出2011^n的后四位。
Input 第一行为一个正整数k,代表有k组数据,k<=200接下来的k行, 每行都有一个正整数n,n的位数<=200 Output 每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0 Sample Input 3 5 28 792 Sample Output 1051 81 5521直接暴力解的话肯定超时超到天际,所以就需要进行优化。将小数的多次转换成大数的较少次。
按照这个思路,再利用位运算节省时间。#include#include using namespace std;int f(int number,int n,int mod){ int ans=1; number=number%mod; while(n) { if(n&1)//如果n为奇数,就让ans先乘一次number,如果不是,就将number平方,n/2 ans=(ans*number)%mod; n=n>>1; number=(number*number)%mod; } return ans;}int mode(char *str,int N)//大数取模{ int i=0; int number=0; while(str[i]) { number=((number*10)+str[i]-'0')%N; i++; } return number;}int main(){ const int N=1e4; int T; cin>>T; while(T--) { char str[210]; memset(str,0,sizeof(str)); cin>>str; int number=0; number=mode(str,N); cout< <