突破口:F(n)=∑i=1n(i×∑j=inCij) = 2n×(n-1)+1
怎么推的?找规律的。此外,还有公式C0n+…+Cnn=2n,或许可以帮助推出上式。
输入数据很大,需要用快速幂。
代码如下:
#include<cstdio>
#include<iostream>
#define mod 1000000007
using namespace std;
long long quick_pow(long long a,long long b) //快速幂(自个写的,可能会与网上的不太一样)
{
long long ans=1;
while(b!=0)
{
if(b%2==0)
{
a=(a*a)%mod;
b/=2;
}
else
{
ans=(ans*a)%mod;
b--;
}
}
return ans;
}
int main()
{
long long n;
int i;
long long ans;
while(~scanf("%lld",&n))
{
ans=quick_pow(2,n);
n=(n-1)%mod; //取模运算要仔细,否则容易出错,而且一出错还很难找到哪里错。
ans=(ans*n+1)%mod;
printf("%lld\n",ans);
}
return 0;
}
下面是另外一个代码:
#include<cstdio>
#include<iostream>
#define mod 1000000007
using namespace std;
long long quick_pow(long long a,long long b)
{
long long ans=1;
while(b!=0)
{
if(b%2==0)
{
a=(a*a)%mod;
b/=2;
}
else
{
ans=(ans*a)%mod;
b--;
}
}
return ans;
}
int main()
{
long long n;
int i;
long long ans;
while(~scanf("%lld",&n))
{
ans=(quick_pow(2,n)*(n-1)%mod+1)%mod;
printf("%lld\n",ans);
}
return 0;
}
下面这个代码WA,仅仅就是因为取模的过程不一样。因此,当需要多次取模的时候,一定要小心。