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 |
Re:想不到好的算法,只能枚举了In Reply To:想不到好的算法,只能枚举了 Posted by:peijian at 2012-03-30 21:28:09 > #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