noip 同余方程

描述

求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解。

格式

输入格式

输入只有一行,包含两个正整数a, b,用一个空格隔开。

输出格式

输出只有一行,包含一个正整数x0,即最小正整数解。输入数据保证一定有解。

样例1

样例输入1

3 10

样例输出1

7

限制

每个测试点1s

提示

对于40%的数据,2 ≤b≤ 1,000; 
对于60%的数据,2 ≤b≤ 50,000,000; 
对于100%的数据,2 ≤a, b≤ 2,000,000,000。

来源

Noip2012提高组复赛Day2T1

#include<cstdio>
#include<cstring>
long long aa[200010];
int phi;
long long int mod;
long long int poww(long long int a)
{
//    printf("%lld ",mod);
    int b=phi-1;
    long long ans=1;
    while(b) 
    {
        if(b&1) ans=ans*a%mod;
        b=b>>1;
        a=a*a%mod;
    }
    return ans;
}
int getphi(int x)
{
    int sum=x;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            sum=sum/i*(i-1);
            while(x%i==0) x/=i;
        }
    }
    if(x>1) sum=sum/x*(x-1);
    return sum;
}
int main()
{
    long long int a;
    scanf("%lld %lld",&a,&mod);   
    phi=getphi(mod);
  //  printf("%d ",phi);
  //  printf("%lld ",mod);
//  printf("%d",ans);
    long long  ans=poww(a);
    printf("%lld",ans);
    return 0;
}
View Code

不会用拓欧求逆元;

只会用费马小定理求逆元;

(我好菜!!!)

posted @ 2017-09-23 12:05  12fs  阅读(213)  评论(0编辑  收藏  举报