HDU 6467 简单数学题
Problem Description
已知
F(n)=∑i=1n(i×∑j=inCij)
求 F(n) mod 1000000007Input
多组输入,每组输入占一行,包含一个整数n(1 <= n <= 1e18)。
数据不超过300000组。
数据不超过300000组。
Output
对于每组输入,输出一行,包括一个数代表答案。
Sample Input
5 100
Sample Output
129 660756544
这道题是一个数学题,最开始没有推出递推公式,是按照数学公式一步一步硬算,用Java一边算一边余,但是输入100结果都出来不到。看了题解,要推出一个递推公式,n=1时,F(n)=1;n>1时,F(n)=F(n-1)+n*2的(n-1)次方。
#include <bits/stdc++.h> #define INF 0x3f3f3f3f #define LL long long using namespace std; const LL mod = 1000000007; inline long long multi(long longx,long long y)//////O(1)的优化乘法防止溢出 { long longtmp=(x*y-(long long)((long double)x/mod*y+1.0e-8)*mod); return tmp<0 ?tmp+mod : tmp; } LL qpow(LL a, LL n) { LL res = 1; while(n){ if(n&1) res = multi(res, a)%mod; a = multi(a, a); n>>=1; } return res%mod; } int main() { LL N, p, ans; while(~scanf("%lld", &N)){ p = qpow(2, N); ans = (multi((N-1), p)%mod+1)%mod; printf("%lld\n", ans); } return 0; }