【简要题意】求Σi=1ni22i\Sigma^n_{i=1}i^22^iΣi=1ni22i mod 1e9+7mod \ 1e9+7mod 1e9+7的值,n<=1e9n<=1e9n<=1e9
【分析】线性复杂度的算法显然是好想的。低于线性的算法有两种:
1.数论
2.推式子
这道题是后者,证明过程如下:
设Sn=1∗2+4∗22+9∗23+.....+n2∗2n设S_n=1*2+4*2^2+9*2^3+.....+n^2*2^n设Sn=1∗2+4∗22+9∗23+.....+n2∗2n
则2Sn=1∗22+4∗23+9∗24+......+n2∗2n+1则2S_n=1*2^2+4*2^3+9*2^4+......+n^2*2^{n+1}则2Sn=1∗22+4∗23+9∗24+......+n2∗2n+1
相减整理可得到Sn=n2∗2n+1−(1∗2+3∗22+5∗23+........(2n−1)∗2n)相减整理可得到S_n=n^2*2^{n+1}-(1*2+3*2^2+5*2^3+........(2n-1)*2^n)相减整理可得到Sn=n2∗2n+1−(1∗2+3∗22+5∗23+........(2n−1)∗2n)
再设Tn=(1∗2+3∗22+5∗23+........(2n−1)∗2n)再设T_n=(1*2+3*2^2+5*2^3+........(2n-1)*2^n)再设Tn=(1∗2+3∗22+5∗23+........(2n−1)∗2n)
同理乘二再相减Tn=(2n−3)∗2n+1+6同理乘二再相减T_n=(2n-3)*2^{n+1}+6同理乘二再相减Tn=(2n−3)∗2n+1+6
回到原式得Sn=(n2−2n+3)∗2n+1−6回到原式得S_n=(n^2-2n+3)*2^{n+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;
}