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

25 篇文章 0 订阅
23 篇文章 0 订阅
这是一道关于优化选择区间以最小化代价的问题,最大值可达 10^18。通过数学公式和逆元的概念,可以求解出付出的最大代价。样例输入和输出展示了不同规模数据的处理结果。
摘要由CSDN通过智能技术生成

题目链接

问题描述

给出一个数字 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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值