我们如何在C ++中存储和打印factorial(2 ^ n)/(2 ^ n -1))mod1000000009。这里n可以大到20.当我尝试使用以下代码打印它时,它显示n = 20的分段错误 #包括 #包括 使用namespace std;
long int factorial(int n)
{
if(n<=1){return 1;}
else
return (n%1000000009)*(factorial(n-1))%1000000009;
}
int main()
{
int K;
long long int numofmatches=0;
long long int denominator=0;
long long int factor=0;
long long int times=0;
long long int players=0;
cin>>K;
if(K==1)
{
cout<<2<<endl<<2<<endl;
return 0;
}
else
{
denominator=pow(2,K);
cout<<"Denominator="<<denominator<<endl;
numofmatches=factorial(denominator)%1000000009;
denominator-=1;
cout<<"numberofmatches="<<numofmatches<<endl;
cout<<"Denominator="<<denominator<<endl;
factor=numofmatches/denominator;
cout<<"Factor="<<factor<<endl;
while(times<=denominator)
{
cout<<(times*factor)<<endl;
++times;
}
}
return 0;
}
答案 0 :(得分:2)
首先,请注意(2^n)! / (2^n-1)
等于(2^n-2)! x 2^n
。
现在,(2^20-2)!
本身已经是一个非常大的数字来计算。
你可以做的是,在每次乘法后用1000000009模拟中间结果:
#define MAX ((1<<20)-2)
unsigned long long res = 1;
for (unsigned int i=1; i<=MAX; i++)
res = (res*i)%1000000009;
res = (res*(MAX+2))%1000000009;
如果要在1到20之间迭代n
的所有值,则可以使用:
#define MAX_N 20
unsigned int arr[MAX_N+1] = {0};
void Func()
{
unsigned int i = 1;
unsigned long long res = 1;
for (int n=1; n<=MAX_N; n++)
{
unsigned int max = (1<<n)-2;
for (; i<=max; i++)
res = (res*i)%1000000009;
arr[n] = (unsigned int)((res*(max+2))%1000000009);
}
}
BTW,对于大于29的任何n
,结果将只为0,因为(2^30-2)
大于1000000009。
因此(2^30-2)!
可被1000000009整除,因此(2^30-2)! mod 1000000009
等于0.