问题描述
给出一个数字 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;
}