大意:帮chika解决数学问题
先输入一个正数T(1<=T<=10的5次方)表示数据组数,跟着的T行,每行包括一个正数n(1<=n<=10的18次方)
输出 (i从加到n)∑ i²*Cn,i(n为下标,i为上标的排列组合)%1000000007
sample input
3
1
4
100
sample output
1
80
337477370
题解:规律题 题目原解是对整个式子求两次导,然后得出ans=(n+1)*n*2的n-2次方
个人思路:由于n的18次方太大 递推是不可能的,那么这道题应该就是要直接找n和ans之间的规律 先写了一份模拟出了12份数据 然后发现ans/n之间近似2倍递增 把乘数单独提出来 考虑乘数和n的关系 很容易就发现乘数为2的n次方 * (n+1)/4 (这样写是不行的 快速幂取模使得/4除不尽 会被取整 导致ans变小一点点) 把四分之一合并到2的n次方 得出乘数为2的n-2次方 *(n+1),再乘上n即为ans;
以下附上快速幂版本(嫌麻烦全部开了long long):
#include<iostream>
using namespace std;
const int mod=1000000007;
long long int quick(long long int n)
{
long long int ans=1,d=2;
while(n!=0)
{
if(n&1) ans=(ans*d)%mod;
n>>=1;
d=(d*d)%mod;
}
return ans; }
int main(){
long long n,t,ans;
cin>>t;
while(t--){
cin>>n;
if(n==1)
cout<<"1"<<endl;
else{
long long int sum=quick(n-2);
ans=(sum%mod*((n+1)%mod)*(n%mod))%mod;
cout<<ans<<endl;}
}
}