BZOJ3034: Heaven Cow与God Bull

来源:互联网 发布:数据库服务器 编辑:程序博客网 时间:2024/06/04 05:31

根据欧拉函数的表达式我们发现要使答案最大则这个一定有若干个质数相乘

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define ll long longconst ll maxn=1000000;ll prime[maxn+1],tot;bool check[maxn+1];const    ll Bt=7;const ll M=10000000;struct H{    ll len;    ll A[6001];    H(){len=0;memset(A,0,sizeof(A));}    void get()    {        char c[26001];        scanf("%s",c);        ll l=strlen(c);        for(ll i=0;i<l;i++)c[i]-='0';        len=l/Bt+(l%Bt?1:0);        ll t=l%Bt;        if(l%Bt)        {            for(ll i=l%Bt;i;i--)                A[len-1]=A[len-1]*10+c[l%Bt-i];        }        else            A[len-1]=c[6]+10*(c[5]+c[4]*10+c[3]*100+c[2]*1000+c[1]*10000+c[0]*100000);        for(ll i=0;i<len-1;i++)            l=(len-i-1)*Bt+(t==0?Bt:t),A[i]=c[l-1]+c[l-2]*10+c[l-3]*100+c[l-4]*1000+c[l-5]*10000+c[l-6]*100000+c[l-7]*1000000;    }    ll &operator [](ll x){return A[x];}    H operator *(ll a){        H c;        for(ll j=0;j<len;j++)c[j]=A[j]*a;        c.len=len;        for(ll i=0;i<c.len||c[i];i++)        {            c[i+1]+=c[i]/M;            c[i]%=M;            c.len=max(c.len,i+1);        }        return c;    }    void print()    {        printf("%lld",A[len-1]);        for(ll i=len-2;~i;i--)            printf("%07lld",A[i]);    }};bool cmp(H a,H b){       if(a.len^b.len)return a.len<b.len;    for(ll i=a.len-1;~i;i--)        if(a[i]^b[i])return a[i]<b[i];    return true;}struct Q{ll no;H A,ans;bool operator <(Q a){return no<a.no;}};bool cmp2(Q a,Q b){return cmp(a.A,b.A);}bool cmp3(Q a,Q b){return a.no<b.no;}Q S[201];char c;int main(){//  while(true)//  /{//      H A;//      A.get();    //  A.print();//  }    for(ll i=2;i<=maxn;i++)    {        if(!check[i])prime[++tot]=i;        ll k,j;        for(k=prime[j=1]*i;k<=maxn;k=prime[++j]*i)        {            check[k]=true;            if(i%prime[j]==0)break;        }    }    ll n;    scanf("%lld",&n);    for(ll i=1;i<=n;i++)    {        S[i].A.get();        S[i].no=i;    }    sort(S+1,S+1+n,cmp2);    H last,no;    last.len=1;    last[0]=1;    no=last;    ll pos=1;    for(ll i=1;i<=n;i++)    {        while(cmp(no,S[i].A))last=no,no=no*prime[pos++];        S[i].ans=last;    }    sort(S+1,S+1+n,cmp3);    for(ll i=1;i<=n;i++)        S[i].ans.print(),putchar('\n');    return 0;}
0 0
原创粉丝点击