首页 > 其他分享 > CSP模拟-30D

CSP模拟-30D

时间:2023-08-25 20:56:22浏览次数:55  
标签:int 我们 ans Yes binom 30D CSP 模拟 define

[AGC019F] Yes or No

我们可以试着把所有"最优策略的答题历程"放在一张网状图里。

就像这样。(声明:我们默认\(n \geq m\))

我们认为\((x,y)\)表示还剩\(x\)道答案为\(Yes\)的题,\(y\)同理.

认为向左走为回答\(Yes\),向下为\(No\).

然后你就会发现你啥也发现不了,

答题的过程就是从右上角\((n,m)\)走到\((0,0)\)的过程.

首选易知,我们应该尽可能的让我们的回答尽可能的向\(x=y\)这条直线靠拢.

这个是显然的,因为我们要尽可能的让"无论答案是什么,我们的回答都是正确的"这一事件发生.

我们画出的红线,就是我们的最优策略.

而答案是不确定的,所以其实是"随便走"的"答案"和我们的最优策略的交点,就是我们对的题的数目.


我们可以先随便画出一种答案.

显然,我们可以把\(x=y\)这条直线以上的部分翻折下来——这对结果没有影响.

先抛开竖直的不看,

我们所有的横线都在最优策略所在的红线上,

所以这些横线的总贡献即为\(n\).

但这样只计算了\(x \neq y\)的情况.

再来计算\(x=y\)的情况.

显然我们需要求出经过\(x=y\)这条直线上某一点的概率.

先求出经过某一点的方案数:

\[\binom{n-i+m-i}{n-i} * \binom{i+i}{i} \]

再除以$$\binom{n+m}{n}$$

因为此时向左走和向下走的概率是一样的,所以他们的贡献均为$ \frac{1}{2} $

总起来,可得

\[ans= \sum_{i=1}^{min(n,m)} \binom{n+m-2i}{n-i} \binom{2i}{i} * \frac{1}{2 \binom{n+m}{n} }* max(n,m) \]

点击查看代码


#include<bits/stdc++.h>
using namespace std;
#define il inline
#define endl '\n'
const int N=5e6;
const int mod=998244353;
#define int unsigned long long
#define Croll(i,l,r) for(int i=l;i<=r;++i)
#define Troll(i,l,r) for(int i=l;i>=r;--i)
//////////
namespace solve
{
    int n,m,ans;
    int f[N<<1],g[N<<1];

    int C(int,int);
    int qp(int,int);
    void Wonder_of_U();
}using namespace solve;
//////////
namespace rw
{
    il int read();
    il void write(int);
    il void Write(int);
}using namespace rw;
//////////
main()
{
    n=read();m=read();
    if(n<m)swap(n,m);
    Wonder_of_U();

    Croll(i,1,m)
        ans=(ans+C(2*i,i)*C(n+m-2*i,n-i)%mod*g[2]%mod)%mod;
    ans=(ans*qp(C(n+m,n),mod-2)%mod);
    ans=(ans+n)%mod;
    cout<<ans<<endl;
}
//////////
namespace solve
{
    int C(int n,int m)
    {
        return f[n]*g[m]%mod*g[n-m]%mod;
    }
    int qp(int x,int k)
    {
        int ans=1;
        while(k)
        {
            if(k & 1)ans=ans*x%mod;
            x=x*x%mod;k>>=1;
        }
        return ans;
    }
    void Wonder_of_U()
    {
        f[0]=1;g[0]=1;
        Croll(i,1,n<<1)
            f[i]=f[i-1]*i%mod,
            g[i]=g[i-1]*qp(i,mod-2)%mod;
    }
}
//////////
namespace rw
{
    il void write(int x)
    {Write(x);cout<<endl;}
    il int read()
    {
        int f=1,x=0;char w=getchar();
        while(w<'0'||w>'9')
        {if(w=='-')f=-1;w=getchar();}
        while(w>='0'&&w<='9')
        {x=(x<<3)+(x<<1)+(w^48);w=getchar();}
        return f*x;
    }
    il void Write(int x)
    {
        if(x<0) putchar('-'),x=-x;
        if(x>9) Write(x/10);
        putchar(x%10+'0');
    }
}

标签:int,我们,ans,Yes,binom,30D,CSP,模拟,define
From: https://www.cnblogs.com/Cayde-6/p/17657530.html

相关文章

  • [Lua] 实现所有类的基类Object、模拟单继承OO、实现抽象工厂
    所有类的基类ObjectLua没有严格的oo(Object-Oriented)定义,可以利用元表特性来实现先定义所有类的基类,即Object类。代码顺序从上到下,自成一体。完整代码定义一个空表Object,__index指向其自身(继承将直接使用该表作为对象的元表)Object={}Object.__index=Objectnew定......
  • [AGC030D] Inversion Sum
    题目大意一个长度为\(n\)的数列,然后给你\(q\)个交换或不交换操作,你可以选择操作或者不操作,问所有情况下逆序对的总和。答案需要对\(10^9+7\)取模。(\(n\leq3000\),\(q\leq3000\))。思路这道题非常巧妙。我们先考虑转化题意,求逆序对数量的期望。记\(dp_{i,j}\)表......
  • [AGC030D] Inversion Sum 题解
    题意给定一个长度为\(n\)的排列\(a\)和\(m\)个形如\(\left(x,y\right)\)的操作,每次操作可以选择是否交换\(a_x,a_y\),求最终所有形成的排列的逆序对总数。(\(1\len,m\le3000\))。题解考虑转化题意,考虑求出最终总的期望逆序对数,即CF258D。转化答案\[\text{Ans}=......
  • cocos2dx之利用CCSpriteBatchNode创建多个Sprite
    相关技术文档,我们在渲染一个图片的时候经常都是一次渲染一个,如果图片资源很多的话,自然降低了效率,这个时候,我们想,要是能一次渲染完毕,以后要再创建的时候,就不需要再渲染就好了,刚好提供了一个类:CCSpriteBatchNode,一次渲染多个,具体看如下代码:voidMyBathNodeLayer::initLayer(){ CCSi......
  • CSP-S 2019 笔试
    CSP-S2019笔试第6题没有重复数字的4位数,可选\(1,2,4,8\),方案数$A_4^4=24$有一对重复数字,可选\(1,1,2,4or1,1,2,8or1,1,4,8or8,8,2,4or8,8,2,1or8,8,1,4\),方案数$A_4^4/A_2^2\times6=72$有两对重复数字,可选\(1,1,8,8\),方案数$A_4^4/(A_2......
  • 2019年牛客普及模拟赛5
    字符统计:给出一个只包含空格和小写字母的字符串,问出现次数最多的字符(多个字符按照字典序输出)签到题。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intsum[250];charans[250];signedmain(){ //freopen("T1.in","r",stdin); //freopen("T1.out"......
  • 70th 2023/8/19 模拟赛总结53
    本次赛完就被拉走去听讲了,来补救一下总结这次依旧爆炸,却没有完全炸裂,110pts,暴力没拿完,试图切掉T3,失败,事后发现离正解很近然后暴力分没拿完,T2还有10分,但为了打T3只拿了20,结果T3只拿了和暴力相同的分,最后比全暴力分都低没法不服,因为自己得承担失误还是那句:至少迈出了这步。比......
  • 69th 2023/8/18 模拟赛总结52
    本次再次爆零,甚至原因都差不多又是因为想切题,又是T2,又是熟悉的2个半小时,硬刚一道题,下场惨烈这一次开始思索原因,自己在开打T2之前,选择相信了直觉,没有先将思路过一遍脑子再开始打这次的看题+思考时间有足足50分钟,到了8点40才开题,然后再加上T2调了一会,发现打完后只剩1h发现只......
  • 56th 2023/7/4 模拟赛总结40
    额,这场比赛应该打得算认真,虽然最后因为一些奇怪的因素导致没有拿到所想的排名,但是总体可以首先先思考了很久,T2T3都挺接近正解的,但是因为一些知识点的欠缺二没有打下来如:T3的缩点,还有T2的一部分结论然后当时是把T2暴力拉满,还想哈希卡常过的,结果是低估了数据的强度,被卡的死死的,拿......
  • 模拟集成电路设计系列博客——1.2.2 共漏放大器(源极跟随器)
    1.2.2共漏放大器(源极跟随器)另一个电流镜的常见应用时为源极跟随器提供偏置电流,在下图的例子中,\(Q_1\)为源极跟随器,\(Q_2\)为给\(Q_1\)提供偏置电流的有源负载,这个结构一般用于电压缓冲器,因此也被称作源极跟随器。因为输入和输出节点分别在栅极和源极,漏极作为小信号地,这个结构同......