C++ 逆模的奇异行为

C++ 逆模的奇异行为,c++,primes,factorial,number-theory,modular-arithmetic,C++,Primes,Factorial,Number Theory,Modular Arithmetic,我编写了以下代码来计算n!模p…假设n和p很接近…但它以一种相当有趣的方式运行,无法找出错误..某处有一些溢出..约束为1t; 而(t--){ 无符号整数n,p; 长整型r; cin>>n>>p; r=p-1; 如果(n>=p){ cout21!是51090942171709440000,而2^64只有1844674407370955161:因此,如果无符号long-long是一个64位的量(很可能),它就不合适了。定义ios\u基::与stdio同步(0);cin.tie(0)o.o我从未见过

我编写了以下代码来计算n!模p…假设n和p很接近…但它以一种相当有趣的方式运行,无法找出错误..某处有一些溢出..约束为1t; 而(t--){ 无符号整数n,p; 长整型r; cin>>n>>p; r=p-1; 如果(n>=p){
cout21!是51090942171709440000,而2^64只有1844674407370955161:因此,如果
无符号long-long
是一个64位的量(很可能),它就不合适了。

定义ios\u基::与stdio同步(0);cin.tie(0)
o.o我从未见过这样的宏(我的意思是,我知道它打算做什么,但使用的标识符……让我无话可说)我认为你的
a*=a
溢出了。是的,你是对的,它确实溢出了,尽管它显示了21!mod71的正确答案,但它溢出了指定限制内的其他数字,溢出发生在哪里?添加跟踪程序,如
couti have culated 21!我正在使用累积mod,以便该数字永远不会变为grea大于p
(a/b)mod p = ((a mod p)*(b^(p-2))mod p)mod p
#include<bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
unsigned int pow(unsigned int a, unsigned n,unsigned int p) {
unsigned int ret = 1;
while(n) {
if((n&1)== 1) ret=(ret*a)%p;
a=a%p;
a=(a*a)%p;
 n=n>>1;
}
return ret;
}
int main(){_
int t;
cin>>t;
while(t--){
    unsigned int n,p;
    long long int r;
    cin>>n>>p;
    r=p-1;
    if(n>=p){
        cout<<"0\n";
    }
    else{
        for(unsigned int i=p-1;i>n;i--){
            r=((long long)r*pow(i,p-2,p))%p;

        }
        cout<<r<<"\n";
    }
}   
return 0;
}