B. Cobbs,Wish I Knew How to Sort,G - Shinyruo and KFC

87 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情

B. Cobbs

 可以看出有这样的一个不等式

n(n1)2nk<=ijk(a[i]a[j])<=n(n1)n*(n-1)-2nk<=i*j-k*(a[i]|a[j])<=n*(n-1)

 左边的式子可以化成n*(n-2k-1),然后可以发现当i<=(n-2k-1)时,即使j取到了n,a[i]|a[j]=0,还是要小于等于最小值的,所以可以直接从n-2*k开始遍历,而k最多100,所以这题直接暴力就可以了,,,

Codeforces Round #735 (Div. 2) B. Cobb(巧妙的暴力优化)_合金Bunny酱的博客-CSDN博客

int t,n,k,a[100005];
signed main()
{
    //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        int ans=-1e18;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=max(n-2*k,1LL);i<=n;i++)
            for(int j=i+1;j<=n;j++)
            ans=max(ans,i*j-k*(a[i]|a[j]));
        cout<<ans<<endl;
    }
    return 0;
}
//

Wish I Knew How to Sort 概率

假设0的个数是cnt0个,那么前cnt0的位置一定都要是0才可以,假设cnt1为前cnt0的位置是1的个数,那么一定得把这cnt1个1都换成0才可以,一共有cnt1*cnt1种换法,总的换法是C(n,2),所以总的期望就是p(cnt1)+p(cnt1-1)+...+p(1),也就是还剩cnt1个1的期望加上还剩cnt1-1个的期望一直加到还剩1个的期望

Codeforces Round #829 (Div. 2 + Div. 1) 2C/1A - 2E/1C - 知乎 (zhihu.com)

int t,n,a[200005],dp[200005];
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        int cnt0=count(a+1,a+n+1,0);
        int cnt1=count(a+1,a+cnt0+1,1);
        dp[0]=0;
        int c2=(n*(n-1)%mod)*getinv(2)%mod;
        for(int i=1;i<=cnt1;i++)
        {
            int p=(i*i%mod)*getinv(c2)%mod;
            //dp[i]=dp[i-1]+getinv(p);
        }
        cout<<dp[cnt1]<<endl;
    }
    return 0;
}
//

G - Shinyruo and KFC

自己写的代码太多了,而且思路也有点复杂,原来只需要统计每个数出现多少次然后就是几次方就可以,a数组最多会出现根号(1e5)个数,所以直接暴力就可以,枚举m,每次都是所有的C(i,a[i])相乘,然后发现有很多a[i]是相同的,然后看看出现了多少次就是多少次方就可以了

【2021CCPC 威海】A、D、G、J_我wa的一声就哭出来了的博客-CSDN博客

int Lcm(int a,int b){return a*b/__gcd(a,b);}
int n,m,a[50005],fac[100005],ifac[100005],tx[100005];
set<int>s;
void init()
{
    fac[0]=1;
    for(int i=1;i<=100000;i++) fac[i]=fac[i-1]*i%mod;
    ifac[100000]=getinv(fac[100000]);
    for(int i=99999;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
}
int C(int a,int b)
{
    if(b>a) return 0;
    return (fac[a]*ifac[a-b]%mod)*ifac[b]%mod;
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>n>>m;
    init();
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        tx[a[i]]++;
        s.insert(a[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int ans=1;
        for(auto x:s)
        {
            ans=(ans*qpow(C(i,x),tx[x]))%mod;
        }
        cout<<ans<<endl;
    }
    return 0;
}
//