hdu4704——Sum

这里写图片描述

emmmmm狗屁费马小定理
我们首先定义 An=S1+S2+...+Sn A n = S 1 + S 2 + . . . + S n ,所以 An+1=S1+S2+...+Sn+Sn+1 A n + 1 = S 1 + S 2 + . . . + S n + S n + 1 ,而 Sn+1 S n + 1 表示n+1个数组成n的情况数,我们考虑第一个数为 1,2,...n 1 , 2 , . . . n ,比如第一个数是1的情况, Sn+1 S n + 1 就转化为 Sn S n ,同理,最后 Sn+1=S1+S2+...+Sn S n + 1 = S 1 + S 2 + . . . + S n ,代入前式得到, An+1=2An A n + 1 = 2 A n ,因此所求的即是 2n 2 n % m m

2 n % m = ( 2 n % ( m 1 ) × 2 n m 1 ( m 1 ) ) % m = ( 2 n % ( m 1 ) ) % m × ( ( 2 n m 1 ) m 1 ) % m = 2 n % ( m 1 ) ) % m

所以,最后就是将 2n%m 2 n % m 转化为 2n%(m1)%m 2 n % ( m − 1 ) % m ,肯定快了

代码:

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=100050;
const int MOD=1e9+7;
char s[N];
long long qPow(long long a,long long k){
    long long sum=1;
    while(k){
        if(k%2){
            sum=(sum*a)%MOD;
        }
        a=a*a%MOD;
        k>>=1;
    }
    return sum;
}
int main(void){
    while(~scanf("%s",s)){
        long long sum=0;
        int i=0;
        while(s[i]){
            sum=(sum*10+s[i]-'0')%(MOD-1);
            i++;
        }
        long long n=sum-1;
        printf("%lld\n",qPow(2,n));
    }
    return 0;
}
全部评论

相关推荐

05-07 13:29
已编辑
门头沟学院 Java
北斗导航Compass低仿版:能不能先搞清楚优先级啊,怎么可能是项目问题,项目很重要吗?又没学历 又没实习大厂凭啥约面?那玩具项目 没应用在真实生产环境下的 就算做上天又有什么用?早点找个小公司实习 拿小公司实习去投大厂实习,这才是你现在该做的
投递美团等公司9个岗位 简历被挂麻了,求建议
点赞 评论 收藏
分享
03-25 19:00
东北大学 Java
程序员牛肉:太好了,是聊天记录。不得不信了。 当个乐子看就好,不要散播焦虑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务