BZOJ3034: Heaven Cow与God Bull

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

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long

const
 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值