2011的n次方

题目:http://noi.openjudge.cn/ch0204/2991/

总时间限制:1000ms  内存限制: 65536kB
描述
已知长度最大为200位的正整数n,请求出2011^n的后四位。
输入
第一行为一个正整数k,代表有k组数据,k<=200接下来的k行,

每行都有一个正整数n,n的位数<=200

输出
每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0
样例输入
3
5
28
792
样例输出
1051
81
5521

参考:

利用循环节:http://m.blog.csdn.net/u013675643/article/details/51820648

高精度除法:http://blog.csdn.net/qq_35479641/article/details/51810945

下面的思路参照循环节的做法。

题目只需要输出后四位,因此答案必然有一个最多5位数的循环节。于是可以先写个暴力去找循环节,发现循环节长度为500,这个数就很好处理了。后面读入n时只保留后三位数,再mod500就得出答案了,比写高精度简单多了~

 1 #include<stdio.h>
 2 #include<string.h>
 3 // m^n % k
 4 long long quickpow(long long m,long long n,long long k)
 5 {
 6     long long ans = 1;
 7     while (n > 0)
 8     {
 9           if (n & 1)
10              ans = (ans*m)%k;
11           n = n >> 1 ;
12           m = (m*m)%k;
13     }
14     return ans;
15 }
16 int main(int argc, char *argv[])
17 {
18     int k;
19     int i;
20     char n[205];
21     int N,len;
22     scanf("%d",&k);
23     for(i=0;i<k;i++)
24     {
25         scanf("%s",n);getchar();
26         N=0;
27         len=strlen(n);
28         N=n[len-1]-‘0‘;
29         if(len>=2) N=(n[len-2]-‘0‘)*10+N;
30         if(len>=3) N=(n[len-3]-‘0‘)*100+N;
31         if(len>=4) N=(n[len-4]-‘0‘)*1000+N;
32         N=N%500;
33         printf("%lld\n",quickpow(2011,N,10000));
34     }
35     return 0;
36 }

还有一个数学论证:http://blog.csdn.net/li744831579/article/details/8784547

时间: 2024-12-29 17:15:53

2011的n次方的相关文章

2991:2011 求2011^n的后四位。

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 1 #include<iostream> 2 #include

2991:2011 (数学)

[题目描述] 已知长度最大为200位的正整数n,请求出2011^n的后四位. [题目链接] http://noi.openjudge.cn/ch0204/2991/ [算法] 一开始想的是把n转换成二进制,然后快速幂,但要用到高精度除法,很烦.容易发现2011的501次方mod10000后为2011,所以2011的n次方和2011的n%500次方膜10000同余,而n%500和n的后三位的数%500结果应该相同,然后快速幂结束.(注意:strlen()返回值是size_t无符号的整数,要转换成有

快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方!

将4的幂次方写成2进制形式后,很容易发现有个特点,2进制中只有1个1(1在奇数位置),并且后面跟了偶数个0:因此问题可以转化为判断1后面是否跟了偶数个0就可以了. 4的整数次幂的二进制可以写为2^(2*n),即也可以写成2的幂次方,当然就满足2的幂次方的条件,即num&(num-1)==0. 思路:首先用条件num&(num-1)==0来判断是否为2的幂次方,若不满足,则不是.若满足,再用条件num&0x5555 5555 来判断,若为真,则这个整数是4 的幂次方.否则不是. #i

BZOJ2440 [中山市选2011]完全平方数

Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一个小X讨厌的数.他列出了所有小X不讨厌的数,然后选取了第 K个数送给了小X.小X很开心地收下了. 然而现在小 W 却记不起送给小X的是哪个数了.你能帮他一下吗? Input 包含多组测试数据.文件第一行有一个整数 T,表示测试数据的组数.

上机题目(初级)-高次方数的尾数(Java)

题目如下: 代码如下: package huawei; public final class Demo { /* 功能: 求解M的N次方的最后三位数(M,N均大于10) 输入参数: int M:M > 10 int N:N > 10 返回值: M的N次方的最后三位数 */ public static int getLast3DigitsOfMN(int M, int N) { int result = 1; for(int i = 0;i < N;++i){ result = (resu

【算法】高效计算n的m次方

今天看到了一个非常好的算法,数学什么什么定理我不懂,但这算法值得我学习. 目的:计算n的m次方 int power(int n,int m) { int odd=1;//用来把剩下的数乘进去 while(p>1){ if((m & 1) != 0)odd*=n; else n*=n; p/=2; } return n*odd; }

开始使用CCA CRM 2011

你可能从微软的市场动态获知我们最近发布了最新版本的Microsoft Dynamics CRM 2011的客户关怀加速器(CCA R2).CCA在一个单一的用户界面提供呼叫中心功能相结合的,能够显示和操纵来自不同业务应用程序的数据.CCA提供了许多功能,包括: l 集成代理的桌面 l 脚本以消除重复的数据输入 l 计算机电话集成(CTI) l 代理活动报告 CCA的核心是一个允许开发人员构建自己的代理的桌面,并提供多会话管理等功能的框架.UI集成不同类型的应用程序(包括Web.Windows窗体

PowerShape 2011 R3 SP1 Update Only Win32 1CD

TraceParts v2.3-ISO 1CD VisCAM.RP.v5.2.8600 1CD  Beta-CAE ANSA.v13.1.2.Win64 1CD CEI.Ensight.Gold.v9.2.2b.Linux64.Debian 1CD CEI.Ensight.Gold.v9.2.2b.MacOSX 1CD InfinySlice.v1.0.8581 1CD Leica.LISCAD.v9.0.3 1CD  AFT Impulse v4.0 2011.04.21 1CD AgroKa

计算99的99次方

package BigNum; public class BigNumAdd { private String num1st; // 被加数 private String num2nd; // 加数 public BigNumAdd() { } public BigNumAdd(String num1st, String num2nd) { this.num1st = num1st; this.num2nd = num2nd; } public String add() { StringBuff