Sum HDU 4704(数论+费马小定理+找规律)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miranda_ymz/article/details/82974161

Sum HDU 4704

分类:数论+费马小定理+找规律

题意:给出N,s(k)=num(x1,x2,x3...,xk).s(k)==将N分成k组得数量。给出N问(s(1)+s(2)....s(N))%mod得值。

思路:看懂题意手动模拟算以下前面几个= =

N=1 s(1)=1 ans=1;

N=2 s(1)=1 s(2)=1 ans=2;

N=3 s(1)=1 s(2)=2 s(3)=1 ans=4;

N=4 s(1)=1 s(2)=3 s(3)=3 s(4)=1 ans=8;

......好吧答案应该就是2^(n-1)%mod.(不行得的话大家也可以打表试试),或者手动在撸一遍N=5,6,7

根据题意n得值真的是非常大。

看过费马小定理的就知道这个肯定要用费马小定理了:如果n和mod互质,a^n%mod==a^(n%(mod-1))%mod

所以处理以下输入的数据,字符串转整数顺便取模。

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll quick_pow(ll a,ll n)
{
    ll ans=1;
    while(n)
    {
        if(n&1)
        {
            ans*=a;
            ans%=mod;
        }
        a*=a;
        a%=mod;
        n>>=1;
    }
    return ans;
}
int main()
{
    ll a,b;
    string s;
    while(cin>>s)
    {
        ll sum=0;
        int len=s.size();
        for(int i=0;i<len;i++)
        {
            sum=(sum*10+s[i]-'0')%(mod-1);
        }
        sum=(sum-1+mod-1)%(mod-1);
        ll ans=quick_pow(2,sum);
        printf("%lld\n",ans%mod);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Miranda_ymz/article/details/82974161