链接
http://www.lydsy.com/JudgeOnline/problem.php?id=2456
题解
比较好玩的题目,这题
sb
不让存,所以只好考虑歪门邪道。
我是用三个不大不小的质数,开三个桶,然后把模数装进去。
肯定每个桶里都只有一个数出现了大于
⌊n2⌋
次,中国剩余定理合并下就好。
代码
//中国剩余定理
#include <cstdio>
#define mod1 10007
#define mod2 233
#define mod3 33331
#define noi 10000000000ll
#define ll long long
using namespace std;
int cnt1[mod1], cnt2[mod2], cnt3[mod3];
ll a[5], N, m[5];
ll pow(ll a, ll b, ll p)
{
ll ans=1, t=a;
for(;b;b>>=1,t=t*t%p)if(b&1)ans=ans*t%p;
return ans;
}
void crt()
{
ll ans=0, M=1, i;
for(i=1;i<=*m;i++)M*=m[i];
for(i=1;i<=*m;i++)ans=(ans+a[i]*M/m[i]*pow(M/m[i],m[i]-2,m[i]))%M;
printf("%lld",ans-noi);
}
inline ll read(ll x=0)
{
char c=getchar(); bool f=0;
while(c<48 or c>57)f=f or c=='-', c=getchar();
while(c>=48 and c<=57)x=(x<<1)+(x<<3)+c-48, c=getchar();
return f?-x:x;
}
int main()
{
ll i, x;
N=read();
for(i=1;i<=N;i++)
{
x=read()+noi;
cnt1[x%mod1]++;
cnt2[x%mod2]++;
cnt3[x%mod3]++;
}
for(i=0;i<mod1;i++)if(cnt1[i]>N>>1)a[1]=i;
for(i=0;i<mod2;i++)if(cnt2[i]>N>>1)a[2]=i;
for(i=0;i<mod3;i++)if(cnt3[i]>N>>1)a[3]=i;
m[1]=mod1, m[2]=mod2, m[*m=3]=mod3;
crt();
return 0;
}