问题:
求
C2n+C3n+C4n+⋯+Cnn
输入
第一行有一个整数T,代表有T组数据。
下面T行每行是一个整数n,代表这个宿舍有n个人。
1<=T<=100000
1<=n<=1000000000
输出
对于每一个结果可能很大,所以你只需要输出对 1000000007 取模的结果
样例输入
2
2
6
样例输出
1
57
首先,一定要想到。C0n+C1n+C2n+C3n+C4n+⋯+Cnn=2n这个公式。
所以,问题就变成了求 2n−n−1 的
的值。
显然需要定义 快速幂取模 函数
先求出 2^n % M = s 的值(设M=10000000007).。
再 计算 (s-n)%M
特别注意
这时的 s-n 是可能为 负值的。
而真实情况不可能为负值
是一个大坑,非常容易忽略这个问题!!!
解决的手段是 (s-n+M)%M
因为是对 M 取余 ,所以只要加上 M 的倍数,就不会影响结果。
而且这样就保证了结果一定为正数。!!!!
#include <stdio.h>
#include <stdlib.h>
long long c = 1000000007;
long long pow(long long n)
{
long long t = 1,m = 2;
while(n)
{
if(n&1==1) t=(t*m)%c;
m=(m*m)%c;
n>>=1;
}
return t;
}
int main()
{
long long T,s,a;
scanf("%lld",&T);
while(T--)
{
scanf("%lld",&a);
s = pow(a); // 2^a %c
s = (s - a - 1 + c)%c;
printf("%lld\n",s);
}
return 0;
}
限定一