广东工业大学第十四届程序设计竞赛 简单数学题(简单数学题)

简单数学题

Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)

·>原题

Problem Description

已知

F(n)=∑ni=1(i×∑nj=iCij)

求 F(n) mod 1000000007

Input

多组输入,每组输入占一行,包含一个整数n(1 <= n <= 1e18)。
数据不超过300000组。

Output

对于每组输入,输出一行,包括一个数代表答案。

Sample Input

5
100

Sample Output

129
660756544

分析

题目不难,但是因为自己的知识太少太不扎实而没有过,还需继续努力。

先看看题目要求吧。求F(n)取模1000000007;
这个F(n)看着就很大,写出前几项也好像没有什么规律,只能发现F(n)都是奇数,试试将前后项作差,还是不明显;(当然要是厉害的话可以看出来因子包含2的n-1次方和n)

nF(n)F(n)-F(n-1)
11
254
31712
44932
512980
6321192

那就只能从式子的结构下手了;
通常这种类型的题目需要让你求得数的式子很多是 某些通项前n项和 或 通项前n项乘积 的形式(也可能有矩阵之类的),不过这道题目的关键在于它的组合数相加式;

0×(C00+C01+C02+C03+C04)+
(C11+C12+C13+C14)+
(C22+C23+C24)+
(C33+C34)+
C44

如上为 n=4 的情况;
这题思路并不单一,下面说一下我的思路。

首先,组合数是“对称”的,像是C44和C04其实没有什么数值上面的区别;

其次,这里的组合数前面的系数是单调线性的,也就是说抽取一部分C44作为C04、抽取一部分C34作为C14等等可以使得各同底组合数的系数一致;

然后,每次F(n) 的 n 加一,会增加一组这样的组合数;
如F(2)->F(3):
F(3)=F(2)+0C03+1C13+2C23+3C33;

根据二项式定理:
有C03+C13+C23+C33=23

再根据前面得到的结论,把系数平分给每一项;
那么便有0C03+1C13+2C23+3C33 = (3/2) *23 = 3 *22

一般化之后,我们便得到了F(n)-F(n-1)的通项T(n);
即T(n) = n *2n-1;
F(n)便是前T(n)项的和;
一个简单的错位相减就能够做出来了。

所以F(n) = (n-1)2n+1;

再来一个快速幂顺便取模就能过了;

然后我在这里犯了个弱智错误,竟然把幂给取模了,我还不觉得有问题,错到自闭;
之前明明看过这些知识,还是没有认真地去理解。还是继续努力吧!
代码很短。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#define MS(X) memset(X,0,sizeof(X))
#define MSC(X) memset(X,-1,sizeof(X))
typedef long long LL;
using namespace std;
const LL mod=1000000007;

int main(){
    LL n;
    while(~scanf("%lld",&n)){
        LL sn=(n-1)%mod;
        LL ans=1,a=2;
        while(n){
            if(n&1){
                ans=(ans*a)%mod;
            }
            a=(a*a)%mod;
            n>>=1;
        }
        ans=((sn*ans)+1)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值