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无符号的整数,要转换成有符号)

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int t,num,ans,b,i;
 4 char a[210];
 5 int main()
 6 {
 7     scanf("%d",&t);
 8     while(t--) {
 9         num=0;
10         ans=1;
11         b=2011;
12         scanf("%s",a);
13         for(i=(int)strlen(a)-3;i<(int)strlen(a);i++) if(i>=0) num=num*10+a[i]-'0';
14         num%=500;
15         for(;num;num>>=1) {
16             if(num&1) ans=(long long)ans*b%10000;
17             b=(long long)b*b%10000;
18         }
19         printf("%d\n",ans);
20     }
21 }

 

转载于:https://www.cnblogs.com/Willendless/p/9357331.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值