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 |
想不到好的算法,只能枚举了#include <iostream> #include<stdlib.h> #include<cmath> #include<ctime> #include<algorithm> #include<cstring> #include<stdio.h> using namespace std; typedef long long ll; const ll MAX_INDEEP = 10000; const ll TABLE_SIZE = 131071; ll sqrt_table[TABLE_SIZE] = {0}; const ll maxn=100; ll factor[maxn]; ll cnt; ll gcd(ll a,ll b){ while(b){ ll tem=b; b=a%b; a=tem; } return a; } ll try_ans(ll n){ ll sqrt_n=sqrt(n*1.0); ll P0=sqrt_n,Q0=1,Q1=n-P0*P0; ll B1,P1,Q2; if(Q1==0)return P0; while(sqrt_table[Q1%TABLE_SIZE]!=Q1){ B1=(sqrt_n+P0)/Q1; P1=B1*Q1-P0; Q2=Q0+B1*(P0-P1); P0=P1; Q0=Q1; Q1=Q2; } B1=(sqrt_n-P0)/sqrt(Q1*1.0); P0=B1*sqrt(Q1*1.0)+P0; Q0=sqrt(Q1*1.0); Q1=(n-P0*P0)/Q0; P1=P0; P0=0; ll step=MAX_INDEEP; while(P1!=P0&&step--){ P0=P1; B1=(sqrt_n+P0)/Q1; P1=B1*Q1-P0; Q2=Q0+B1*(P0-P1); Q0=Q1; Q1=Q2; } return P1; } ll SQUFOF(ll n){ ll t=0; for(ll k=1;t==0||t==1;k++){ ll tem=try_ans(k*n); if(tem==0)continue; t=gcd(tem,n); } return t; } ll mul_mod(ll a,ll b,ll p){ ll res=a%p,ans=0; while(b){ if(b&1)ans+=res; if(ans>p)ans-=p; res<<=1; if(res>p)res-=p; b>>=1; } return ans; } ll mod_exp(ll a,ll n,ll p){ ll d=a%p,ans=1; while(n>1){ if(n&1)ans=mul_mod(ans,d,p); d=mul_mod(d,d,p); n>>=1; } return mul_mod(ans,d,p); } bool miller_rabin(ll n, ll times) { if(n==2)return 1; if(n<2||!(n&1))return 0; ll a, u=n-1, x, y; int t=0; while(u%2==0){ t++; u/=2; } srand(time(0)); for(int i=0;i<times;i++) { a = rand() % (n-1) + 1; x = mod_exp(a, u, n); for(int j=0;j<t;j++) { y = mul_mod(x, x, n); if ( y == 1 && x != 1 && x != n-1 ) return false; //must not x = y; } if( y!=1) return false; } return true; } void findfactor(ll n){ if(n==1)return ; if(miller_rabin(n,6)){ factor[cnt++]=n; return ; } ll p=SQUFOF(n); findfactor(p); findfactor(n/p); } ll Lcm[maxn]; ll num[maxn][2]; int len2,t2; int binary(int x){ int L=0,R=len2; while(L<R){ int mid=(L+R)>>1; if(Lcm[mid]<x)L=mid+1; else if(Lcm[mid]>x)R=mid; else return mid; } return -1; } int A[maxn]; ll ansa,ansb; ll maxs; void dfs(int k){ if(k==t2+1){ ll aa=1,bb=1; for(int i=0;i<=t2;i++){ aa*=(ll)pow(Lcm[i],num[i][A[i]]*1.0); bb*=(ll)pow(Lcm[i],num[i][!A[i]]*1.0); } if(aa+bb<maxs){ maxs=aa+bb; ansa=aa; ansb=bb; } } else{ for(A[k]=0;A[k]<2;A[k]++){ dfs(k+1); } } } int main() { //freopen("in.txt","r",stdin); for (ll i = 0; i < (1 << 16); i++) sqrt_table[i * i % TABLE_SIZE] = i * i; ll a, b; while(scanf("%I64d%I64d",&a,&b)!=EOF){ len2=1; maxs=ll((ll)1<<63)-1; memset(A,0,sizeof(A)); memset(num,0,sizeof(num)); t2=0; if(miller_rabin(b,6))Lcm[0]=b,num[0][1]=1; else{ cnt=0; findfactor(b); sort(factor,factor+cnt); Lcm[0]=factor[0]; for(int i=1;i<cnt;i++){ if(factor[i]!=factor[i-1])Lcm[len2++]=factor[i]; } for(int i=1;i<cnt;i++){ if(factor[i]==factor[i-1])num[t2][1]++; else t2++; } for(int i=0;i<=t2;i++)num[i][1]++; } if(miller_rabin(a,6)){ int index=binary(a); num[index][0]=1; } else{ cnt=0; findfactor(a); sort(factor,factor+cnt); for(int i=0;i<cnt;i++){ int index=binary(factor[i]); num[index][0]++; } } // cout<<t2<<"n"<<endl; // for(int i=0;i<=t2;i++)cout<<Lcm[i]<<" "; // cout<<endl; if(t2==0)ansa=a,ansb=b; else dfs(0); if(ansa>ansb)swap(ansa,ansb); cout<<ansa<<" "<<ansb<<endl; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator