grgs

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
 
const int MAX=100005;
bool pri[MAX];
long long int f[MAX];
int pp[MAX],sz=0;
long long int phi(long long x)
{
    int i;
    long long int ans=x;
    for(i=0;i<sz&&pp[i]<=x;i++)
    if(x%pp[i]==0)
    {
        //cout<<ans<<endl;
        ans=(ans/pp[i])*(pp[i]-1);
        while(x%pp[i]==0) x/=pp[i];
    }
    if(x>1)
    ans=(ans/x)*(x-1);
    return ans;
}
long long int gcd(long long int x,long long int y)
{
    long long int t;
    while(x)
    {
        t=x;
        x=y%x;
        y=t;
    }
    return y;
}
long long int PPow(long long int x,long long int y,int long long a)
{
    long long int ans=1;
    for(;y>0;y>>=1)
    {
        if(y&1) ans=(ans*x)%a;
        x=x*x%a;
    }
    return ans;
}
int main()
{
    long long int i,j;
    memset(pri,0,sizeof(pri));
    memset(pp,0,sizeof(pp));
    for(i=2;i<MAX;i++)
    if(!pri[i])
    {
        pp[sz++]=i;
        for(j=i+i;j<MAX;j+=i)
        {
            //cout<<j<<' '<<pp[j][0]-1<<' '<<i<<endl;
            pri[j]=true;
        }
    }
    //for(i=1;i<=20;i++)
    //cout<<phi(999999999)<<endl;
 
    long long int x,y,a;
    while(cin>>x>>y>>a)
    {
        long long int d=y/(x-1);
        if(d%a==0)
        {
            printf("1\n");
        }
        else
        {
            long long int m=gcd(a,d);
            a/=m;
            if(gcd(a,x)!=1)
            printf("Impossible!\n");
            else
            {
                long long n=phi(a),min=n;
                //cout<<n<<endl;
                for(i=1;i*i<=n;i++)
                if(n%i==0)
                {
                    if(PPow(x,i,a)==1&&i<min)
                    min=i;
                    if(PPow(x,n/i,a)==1&&n/i<min)
                    min=n/i;
                }
                cout<<min<<endl;
            }
        }
    }
    return 0;
}
posted @ 2011-07-18 00:47  Cancri  阅读(198)  评论(0)    收藏  举报