牛客多校开头难,后面简单
杭电正好反着。。。
记一下一个函数,它只对某个元素排序,使得左边的都小于它,右边的都大于它
然后 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;
}
}