首页 > 其他分享 >CF1764D Doremy's Pegging Game 组合数学

CF1764D Doremy's Pegging Game 组合数学

时间:2023-11-01 09:01:19浏览次数:42  
标签:ch Pegging 删除 int Doremy read Game

CF1764D Doremy's Pegging Game

你怎么连简单题也不会?

考虑满足条件当且仅当有连续的n/2向下取整段被删除。

考虑最终状态一定是一次删除联通了两个连续段,然后结束。

我们枚举这个连续段的长度 i 。

最后一个删除的位置有 n/2下取整*2-i 种方案,设另外删除了 j 种,则另外删除的方案数是 C(j,n-2-i) 种,(i+J-1)! 除了最后一个以外的都可以排列。

还有一种情况是n为偶数,i可以等于 n-1 需要特判。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

/*想想你要干什么?
    * 思考你的效率,可以倒计时。
    * 正难则反
    * 明确数组定义
    * 写下可能的思路
    * 特殊情况 ( n == 1 )?
    * 查看溢出,数组越界
    * 做事而不是原地规划
    * 不要在一个方面卡死
    * 多想性质!
*
*/
const int maxn=1e4+10;
int ans=0;
int fac[maxn];
int c[5005][5005];
signed main(){
    int n=read(),p=read();
    fac[1]=1;
    for(int i=2;i<=n;i++){
        fac[i]=fac[i-1]*i%p;
    }
    for(int i=0;i<=n;i++) c[i][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%p;
        }
    }
    for(int i=n/2;i<=n-2;i++){
        for(int j=0;j<=n-2-i;j++){
            ans=(ans+c[n-2-i][j]*fac[i+j-1]%p*(n/2*2-i)%p*n)%p;
//            cout<<ans<<endl;
        }
    }
    if(n%2?0:1){
        ans=(ans+n*fac[(n-2)]%p)%p;
    }
    cout<<ans<<endl;
}

标签:ch,Pegging,删除,int,Doremy,read,Game
From: https://www.cnblogs.com/Hushizhi/p/17802248.html

相关文章

  • CF1889C2. Doremy's Drying Plan (Hard Version)
    容易想到dp:设\(dp_{i,p}\)表示前\(i\)天,强制第\(i\)天dry,并且一共消除了\(p\)个区间的答案。转移时可以考虑枚举前面的决策\(j\),此时有转移方程:\[dp_{i,p}=\max(dp_{j,p-w})+1\]其中\(w\)为满足\(l\in(j,i],r\in[i,n]\)的区间\([l,r]\)个数。显然可以考虑套......
  • CF1889D. Game of Stacks
    啊啊啊每次补完题都感觉这题我场上应该是能想出来的啊!考虑简化问题:若每个栈内只有一个元素,how。此时我们发现所有栈之间构成了一个内向基环树。且环是没有用的,因为我们在环上走一圈之后仍然会回到原点。所以不妨把所有环边删除,此时每棵树的答案即为树根。而对于原问题,同理,我们......
  • CF1889B. Doremy's Connecting Plan
    一开始不会先跳C了!差点满盘皆输!设\(i<j\),则\(i,j\)合并可以看作\(a_i\leftarrowa_i+a_j\)后删掉\(j\)!此时和初始局面本质相同!所以不妨先只看初始局面!不等式右侧和下标有关!显然若右侧\(i,j\)中只要有一个是\(1\),就会让右侧的值大幅减小!设\(1\)和\(i\)合并!则需满......
  • CF1890D Doremy's Connecting Plan
    Problem-1890D-Codeforces这个式子左边是加法,右边是乘法,很不好算但其实是降智题,不过同时也是我不擅长的找性质因为式子左边是加法而不是乘法,因此像类似于并查集那样求出当前每个联通块内\(\suma_i\)等价于固定一个点从这个点的联通块向外扩展。\(i\)越小越好......
  • 用Python的Pygame包做飞行棋
    最近学了下pygame,感觉非常有意思,于是用自己的理解纯手工敲了几个游戏,下面记录一下我做飞行棋的思路过程: 运行结果玩家轮流投骰子然后移动飞机,全程只用鼠标操作,右上方会提示当前的轮次及操作 基础设置1)首先是导包和初始化一些变量,定义SIZE=40表示长方形的......
  • Unity中GameObject对象的方法Find,FindGameObjectsWithTag等API的使用方法
    Unity中GameObject对象的方法Find,FindGameObjectsWithTag等API的使用方法.Find(stringname):.FindGameObjectsWithTag(stringtag):.FindGameObjectWithTag(stringtag):.FindWithTag(stringtag):在Unity中,GameObject类具有一些用于查找和操作游戏对象的方法。.Find(stringna......
  • CF1854E Games Bundles 题解
    乱搞题设个\(dp[i]\)表示和为\(i\)的子序列个数,那么转移是容易的,\(dp[j]+=dp[j-i]\),然后就判下\(dp[60]+dp[60-i]\)是否大于\(m\),发现这样子搞对于比较大的数可能达不到\(m\)的限制,因为这样子转移,默认的是一个数只选一次,但是我们可以重复选,这启发我们需要设定一个值......
  • 0xGame 2023【WEEK2】Crypto全解
    中间的那个人题目信息fromsecretimportflagfromCrypto.Util.numberimport*fromCrypto.CipherimportAESfromhashlibimportsha256fromrandomimport*p=getPrime(128)g=2A=getrandbits(32)B=getrandbits(32)Alice=pow(g,A,p)Bob=pow(g,B,p)......
  • 【0xGame 2023】题解week1
    前段时间在忙各种事情,这两天有学弟学妹要入re,想带着他们打个新生赛,我就打算把这个比赛week1的题先出一遍,后面的之后再说。这次0xGame的re题目名称都很有意思,开始做吧。数字筑基解法直接搜索字符串代码金丹解法就比第一题多个判断过程,不过flag仍然明文网络元婴解法......
  • 2D物理引擎 Box2D for javascript Games 第五章 碰撞处理
    2D物理引擎Box2DforjavascriptGames第五章碰撞处理碰撞处理考虑到Box2D世界和在世界中移动的刚体之间迟早会发生碰撞。而物理游戏的大多数功能则依赖于碰撞。在愤怒的小鸟中,小鸟摧毁小猪的城堡时,便是依赖碰撞而实现的;在图腾破坏者中,当神像坠落到图腾上或摔碎在地面上......