bzoj2456: mode

来源:互联网 发布:淘宝客服网上人工服务 编辑:程序博客网 时间:2024/06/05 12:06

链接

  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 longusing 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;}
0 0
原创粉丝点击