bzoj2456: mode

链接

  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值