C++ 超大数nCr和逆阶乘(MODm)的实现
嗨,我在代码sprint5中实现nCr MODm时遇到问题。 与问题相关的是。。。。。。 . 我学到的是,我可以将mudular算术规则应用于阶乘计算和逆阶乘计算,也可以应用于pow(a,b)MODm计算。但我不知道我遗漏了什么,这导致了错误的答案。 这是我目前的代码C++ 超大数nCr和逆阶乘(MODm)的实现,c++,dynamic,modular-arithmetic,ncr,C++,Dynamic,Modular Arithmetic,Ncr,嗨,我在代码sprint5中实现nCr MODm时遇到问题。 与问题相关的是。。。。。。 . 我学到的是,我可以将mudular算术规则应用于阶乘计算和逆阶乘计算,也可以应用于pow(a,b)MODm计算。但我不知道我遗漏了什么,这导致了错误的答案。 这是我目前的代码 #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algor
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <map>
#include<math.h>
using namespace std;
const int md = 1000000007;
const int co = 2000020;
unsigned long long int ft[co];
long long int fact(unsigned long long int n)
{
return ft[n];
}
void fct(){
ft[1]=1;
for(unsigned long long int i = 2;i<=2000020;i++){
ft[i]=(i*ft[i-1]) % md;
}
}
long long int pow(long long int x, long long int n, long long int mod){
long long int result=1;
while(n>0){
if(n%2 ==1){
result = (result*x) % mod;
}
n= n>>1;
x= (x*x)% mod;
}
return result;
}
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
unsigned long long int m , n;
long long result;
int T;
fct();
cin>>T;
while(T--){
cin>>m>>n;
unsigned long long int mod = md-2;
result = (fact(m+n-2) * pow( ( fact(m-1) * fact(n-1) ) , mod, md )) % md ;
cout<<result<<endl;
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
常数int md=100000007;
常数int co=2000020;
无符号长整型ft[co];
长整型事实(无符号长整型n)
{
返回ft[n];
}
void fct(){
ft[1]=1;
for(无符号长整型i=2;i0){
如果(n%2==1){
结果=(结果*x)%mod;
}
n=n>>1;
x=(x*x)%mod;
}
返回结果;
}
int main(){
/*在此处输入代码。从标准输入读取输入。将输出打印到标准输出*/
无符号长整型m,n;
长期结果;
int T;
fct();
cin>>T;
而(T--){
cin>>m>>n;
无符号长整型模=md-2;
结果=(事实(m+n-2)*pow((事实(m-1)*事实(n-1)),mod,md))%md;
最后我得到了代码中的错误
错误
我应该使用常量变量md
和co
作为无符号long
int而不是仅int
第二个错误是在pow()中计算pow(a,b)%md的算法中
函数,我应该先执行x%md
,然后再进一步处理
因为传递x的概率大于md
当前工作代码为
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <map>
#include<math.h>
using namespace std;
const unsigned long long int md = 1000000007;
const unsigned long long int co = 2000020;
unsigned long long int ft[co];
unsigned long long int fact(unsigned long long int n)
{
return ft[n];
}
void fct(){
ft[0]=1;
for(unsigned long long int i = 1;i<=2000020;i++){
ft[i]=(i*ft[i-1]) % md;
}
}
unsigned long long int pow(unsigned long long int x, unsigned long long int n, unsigned long long int mod){
unsigned long long int result=1;
x = x % md;
while(n>0){
if(n%2 ==1){
result = (result*x) % md;
}
n= n>>1;
x= (x*x)% md;
}
return result;
}
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
unsigned long long int m , n;
unsigned long long int result;
int T;
fct();
cin>>T;
while(T--){
cin>>m>>n;
unsigned long long int mod = md-2;
result = (fact(m+n-2) * pow( ( fact(m-1) * fact(n-1) ) , mod, md )) % md ;
cout<<result<<endl;
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
常量无符号长整型md=100000007;
常数无符号长整型系数co=2000020;
无符号长整型ft[co];
无符号长整型事实(无符号长整型n)
{
返回ft[n];
}
void fct(){
ft[0]=1;
for(无符号长整型i=1;i0){
如果(n%2==1){
结果=(结果*x)%md;
}
n=n>>1;
x=(x*x)%md;
}
返回结果;
}
int main(){
/*在此处输入代码。从标准输入读取输入。将输出打印到标准输出*/
无符号长整型m,n;
无符号长整型结果;
int T;
fct();
cin>>T;
而(T--){
cin>>m>>n;
无符号长整型模=md-2;
结果=(事实(m+n-2)*pow((事实(m-1)*事实(n-1)),mod,md))%md;
coutYourfact
函数在第一行返回,因此大部分不会执行。不,这只是fct()函数,它只是预计算将来需要的阶乘。那么为什么fact
中的所有代码都在那里?如果不打算执行,请将其从问题中删除。实际上,fact函数从ft[]中获取值数组,该数组已经由fct()计算。这是因为我在需要时尝试了这两种计算方法,然后替换为预计算……它工作得更快