(Код)
Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>
typedef long long ll;
void extended_euclid(ll a, ll b, ll *x, ll *y, ll *d)
{ ll q, r, x1, x2, y1, y2;
if (b == 0) {
*d = a, *x = 1, *y = 0;
return; }
x2 = 1, x1 = 0, y2 = 0, y1 = 1;
while (b > 0) {
q = a / b, r = a - q * b;
*x = x2 - q * x1, *y = y2 - q * y1;
a = b, b = r;
x2 = x1, x1 = *x, y2 = y1, y1 = *y; }
*d = a, *x = x2, *y = y2;}
ll inverse(ll a, ll n)
{ ll d, x, y;
extended_euclid(a, n, &x, &y, &d);
if (d == 1) if (x>0) return x; else return (x+n);
return 0;}
int main(){
ll i,j,k,n,t,l; // j - простое число,
for (j=5;j<=97;j++) { // n - 100!(без множителей j) по модулю j,
bool e=true; // t - то, на что надо домножать
for (i=2;i<=sqrt(j);i++) if (j%i==0) {e=false;break;}
if (e) {
n=1;
ll p =(ll)(pow(j,100/j+100/(j*j)+100/(j*j*j)+100/(j*j*j*j)));
for (i=2;i<=100;i++) {
k=i;
while (k%j==0) k/=j;
n=(n*k)%(p);}
t=p-inverse(n,p);
l=100*t/p;
cout<<j<<" "<<t<<endl;
if (100*t/p<4) cout<<"YES "<<j<<" "<<t<<endl;}}
getch();
return 0;
}
Да вроде. А откуда вы взяли первое сравнение?
Я ещё и проверил:
http://www.wolframalpha.com/input/?i=100%21%2F53+mod+53