【簡要題意】求Σi=1ni22i mod 1e9+7的值,n<=1e9
【分析】線性複雜度的算法顯然是好想的。低於線性的算法有兩種:
1.數論
2.推式子
這道題是後者,證明過程如下:
設Sn=1∗2+4∗22+9∗23+.....+n2∗2n
則2Sn=1∗22+4∗23+9∗24+......+n2∗2n+1
相減整理可得到Sn=n2∗2n+1−(1∗2+3∗22+5∗23+........(2n−1)∗2n)
再設Tn=(1∗2+3∗22+5∗23+........(2n−1)∗2n)
同理乘二再相減Tn=(2n−3)∗2n+1+6
回到原式得Sn=(n2−2n+3)∗2n+1−6
【code】
# include<bits/stdc++.h>
# define int long long
using namespace std;
const int mod=1000000007;
int pw(int x,int n)
{
int ans=1;
while (n) {
if (n&1) ans=ans*x%mod;
x=x*x%mod;
n>>=1;
}
return ans%mod;
}
signed main()
{
int n; cin>>n;
n=((pw(2,n+1)*(((n*n%mod-2*n%mod+3)+mod)%mod)-6)+mod)%mod;
cout<<n;
return 0;
}