Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
老兄,你这个有点问题,我给你改了一下In Reply To:终于过了,有几点要说的 Posted by:jiyanmoyu at 2010-02-25 13:41:29 #include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; LL read(){ LL x,f=1;char c; while((c=getchar())<'0'||'9'<c) if(c=='-')f=-1; for(x=(c^48);'0'<=(c=getchar())&&c<='9';x=(x<<3)+(x<<1)+(c^48)); return x*f; } const LL MAXN=1e5+5; LL gcd(LL a,LL b){ return b?gcd(b,a%b):a; } struct node{ LL i,r; node(){ } node(LL I,LL R):i(I),r(R){ } friend bool operator < (const node& a,const node& b){ if(a.r==b.r)return a.i<b.i; return a.r<b.r; } }lis[MAXN]; bool cmpNode_for_lower_bound(const node& a,const node& b){ return a.r<b.r; } bool check(LL a,LL b,LL c){ if(b==1)return printf("0\n"); a%=c,b%=c; LL cnt=0,base=1; for(LL g=gcd(a,c);g!=1;g=gcd(a,c)){ if(b%g)return 0; b/=g,c/=g; base=base*(a/g)%c,++cnt; if(b==base)return printf("%lld\n",cnt); } LL m=ceil(sqrt(c)),tmp=1; for(LL i=1;i<=m;++i){ tmp=tmp*a%c; lis[i]=node(i,tmp*b%c); } sort(lis+1,lis+1+m); for(LL i=1;i<=m;++i){ base=base*tmp%c; node *p=lower_bound(lis+1,lis+m+1,node(0,base),cmpNode_for_lower_bound); if(p!=lis+m+1&&(*p).r==base)return printf("%lld\n",i*m-(*p).i+cnt); } return 0; } int main(){ LL a,b,c; while(~scanf("%lld%lld%lld",&a,&b,&c)&&a&&b&&c){ if(!check(a,c,b))puts("No Solution"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator