Я написал следующий код для вычисления n! По модулю p … Учитывая, что n и p близки … но он работает довольно забавным образом, не могу выяснить ошибку .. Есть некоторое переполнение где-то .. Ограничения 1 < п <= 2 * 10 ^ 9
1 <= N <= 2 * 10 ^ 9
хотя он работает нормально в нескольких случаях … в чем может быть ошибка. Я использовал
(a/b)mod p = ((a mod p)*(b^(p-2))mod p)mod p
как p
простое …. и теорема Вильсона, что (p-1)! mod p = p-1
#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;
}
21! 51090942171709440000, а 2 ^ 64 только 1844674407370955161: так что если unsigned long long
это 64-битная величина (что вполне вероятно), она не подходит.
Других решений пока нет …