【题解】sdoj3759(2018-08-16集训T1)数学公式+逆元+快速幂

题目链接

问题描述

给出一个数字 n,表示有 1 到 n 的序列。 每次你可以选择一个区间
[L,R],并付出 R-L+1 的代价,每个区间只能选择一次,问你最多付出多少代
价。
最后答案太大, 输出 MOD 10^9+7 的结果

输入格式

数字 n

输出格式

答案

样例输入 1

4

样例输出 1

20

样例输入 2

100000

样例输出 2

665533303

数据规模

对于 20% 的数据, n≤1e2
对于 40%的数据, n≤1e3
对于 60% 的数据, n≤1e6
对于 80%的数据, n≤1e9
对于 100% 的数据, n≤1e18


之前思路又跑偏了……想着想着突然发现不就是个公式嘛,然后就秒了。

#include<cstdio>
typedef unsigned long long ull;
const int mod=1e9+7;
ull qpow(ull num,ull mi)
{
    ull ans=1;
    while(mi)
    {
        if(mi&1)ans=(ans%mod)*(num%mod)%mod;
        mi>>=1;
        num=(num%mod)*(num%mod)%mod;
    }
    return ans;
}
int main()
{
    //freopen("play.in","r",stdin);
    //freopen("play.out","w",stdout);
    ull n;
    scanf("%llu",&n);
    ull n1=n+1,n2=n+2;
    n=((n%mod)*(n1%mod))%mod;
    n=((n%mod)*(n2%mod))%mod;
    n=(n%mod)*(qpow(6,mod-2)%mod)%mod;
    printf("%llu\n",n);
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/81741735
今日推荐