2018牛客多校第六场j

牛客多校开头难,后面简单

杭电正好反着。。。

记一下一个函数,它只对某个元素排序,使得左边的都小于它,右边的都大于它

然后  yy+暴力枚举

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int MAX=1e7+5;
int Case=1;
unsigned  x,y,z;
unsigned a[MAX],mo[105];
int n;
unsigned tang()
{
    unsigned t;
    x^=x<<16;
    x^=x>>5;
    x^=x<<1;
    t=x;
    x=y;
    y=z;
    z=t^x^y;
    return z;
}
ull gcd(ull m,ull n)
{
    while(1)
    {
        if(n == 0)
            return m;
        long temp = m % n;
        m = n;
        n = temp;
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d %d %d",&n,&x,&y,&z);
        for(int i=0;i<n;i++)
        {
            a[i]=tang();
        }
        int num;
        num=min(n,100);
        nth_element(a,a+n-num,a+n);
        for(int i=0;i<num;i++)
        {
            mo[i]=a[n-i-1];
        }
        unsigned long long ans=0;
        for(int i=0;i<num;i++)
        {
            for(int j=i+1;j<num;j++)
            {
                ull num=gcd((ull)mo[i],(ull)mo[j]);
                ull tp=mo[i]/num*mo[j];
                ans=max(ans,tp);
            }
        }
        printf("Case #%d: ",Case++);
        cout<<ans<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/81529709
今日推荐