我们如何在C ++中存储和打印阶乘(2 ^ n)/(2 ^ n -1))mod1000000009。这里n可以大到20。当我尝试使用以下代码打印时,它显示分段错误n = 20
#包括
#包括
使用名称空间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;
}
最佳答案
首先,请注意(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;
如果要迭代
n
的所有值(介于1和20之间),则可以使用:#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);
}
}
顺便说一句,对于任何大于29的
n
,结果将简单地为0,因为(2^30-2)
大于1000000009。因此
(2^30-2)!
可被1000000009整除,因此(2^30-2)! mod 1000000009
等于0。关于c++ - 在C++中打印(2 ^ n的基础)/(2 ^ n -1)mod m,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22437393/