首页 > 其他分享 >csp-s模拟11

csp-s模拟11

时间:2024-10-14 16:21:09浏览次数:1  
标签:11 ll sum ik ans define csp 模拟 mod

E

题面

image

最暴力的做法,枚举连续段长度\(i\),然后暴力搜索,复杂度\(O(n^3)\)

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
#define pii pair<int,int>
#define lid (rt<<1)
#define rid (rt<<1|1)
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
#define ts cout<<"************"<<endl;
using namespace std;
const int N = 5000+5,INF=1E9;
inline int read()
{
	int x=0,f=1;char ch=getchar_unlocked();
	for(;ch<'0'||ch>'9';ch=getchar_unlocked())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar_unlocked())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;	
}
inline void write(ll x)
{
	if(x<0)x=-x,putchar_unlocked('-');
	if(x>9)write(x/10);
	putchar_unlocked((x%10)|48);
}
ll mod;
ll n,m;
ll dp[N][N];ll tot;
inline ll work(int len,int id,int mx)
{
	if(dp[len][mx])return dp[len][mx];
	if(id>mx&&len<id)return 0;
	if(!len)return mx==id;
	ll ans=0;
	// cout<<(m-(len==n))<<endl;
	for(int i=1;i<=min(len,id);i++)
	{
		ans=(ans+ work( len-i,id,max(mx,i) )*(m-(len!=n))%mod )%mod;
	}
	// cout<<id<<" "<<ans<<endl;
	return dp[len][mx]=ans;
}
int main(int argc, char const *argv[])
{
	file("a");
	// freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);
	n=read();m=read();mod=read();
	for(ll i=1;i<=n;i++)
	{
		// cout<<work(n,i,0)<<endl;
		for(int j=0;j<=n;j++)
			for(int k=0;k<=i;k++)dp[j][k]=0;
		tot+=work(n,i,0)*i%mod;
		// ts;
		tot%=mod;
	}
	write(tot);
	return 0;
}
//10 2 998244353
//100 23333333 998244353

考虑优化,
设$$ans=\sum_{i=1}^n方案数(len=i)$$
设\(F(len<i)\)的方案数

\[ans=\sum_{i=1}^nF(len>=i) \]

\[ans=\sum_{i=1}^n (m^n -F(len<i)) \]

考虑计算

\[\sum_{i=0}^{n-1}F(len<=i) \]

考虑枚举分成\(j\)段
如果没有\(<=i\)的限制,插空法可知为\(C(n-1,j-1)\)
但是有限制,考虑容斥,钦定有\(k\)个元素\(>i\),因为不能有空,则下界为\(i\),则有\(k\)个元素\(>i\),这时候再插空的话,为\(C(n-ik-1,j-1)\)

\[\sum_{i=0}^{n-1}\sum_{j=0}^{n}m\times (m-1)^{j-1}\sum_{k=0}^j(-1)^kC(j,k)C(n-ik-1,j-1) \]

把\(k\)枚举提前
美化一下

\[m\times \sum_{i=0}^{n-1} \sum_{k=0}^n(-1)^k\frac{1}{n-ik} \sum_{j=k}^{n} (m-1)^{j-1}C(j,k)C(n-ik,j)j \]

发现必须满足\(k+ik<=n\)所以枚举\(k\)是调和级数的复杂度
考虑后面部分的组合意义
从\(n-ik\)中选\(j\)个,再从\(j\)个中选\(k\)个,再从\(j\)个中选一个特殊的,再将剩下的\(j-1\)个染成\(m-1\)种颜色
分两种情况,
一种\(k\)中选一个特殊的,对于剩下的染色有\((m-1+不染)=m\)
一种在\(n-ik-k\)中选一个特殊的

\[\sum_{j=k}^{n} (m-1)^{j-1}C(j,k)C(n-ik,j)j=C(n-ik,k)((m-1)^k(n-ik-k)m^{n-ik-k-1}+k(m-1)^{k-1}m^{n-ik-k}) \]

复杂度\(O(n\log n)\)

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
#define pii pair<int,int>
#define lid (rt<<1)
#define rid (rt<<1|1)
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
#define ts cout<<"************"<<endl;
using namespace std;
const int N = 3e5+5,INF=1E9;
inline int read()
{
	int x=0,f=1;char ch=getchar_unlocked();
	for(;ch<'0'||ch>'9';ch=getchar_unlocked())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar_unlocked())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;	
}
inline void write(ll x)
{
	if(x<0)x=-x,putchar_unlocked('-');
	if(x>9)write(x/10);
	putchar_unlocked((x%10)|48);
}
ll mod;
ll n,m;
ll tot;
inline ll qpow(ll a, ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;b>>=1;
	}
	return ans;
}
ll m1[N],mm[N],jie[N],inv[N];
inline ll C(int n,int m)
{
	return jie[n]*inv[m]%mod*inv[n-m]%mod;
}
// #define int long long
ll iv[N];
signed main()
{
	// file("a");
	freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);
	n=read();m=read();mod=read();
	ll ans=0;
	m1[0]=mm[0]=1;
	for(int i=1;i<=n;i++)m1[i]=m1[i-1]*(m-1)%mod,mm[i]=mm[i-1]*m%mod;
	jie[0]=1;inv[0]=1;
	for(int i=1;i<=n;i++)jie[i]=jie[i-1]*i%mod;
	inv[n]=qpow(jie[n],mod-2);
	for(int i=n-1;i>=1;i--)inv[i]=inv[i+1]*(i+1)%mod;
	iv[1]=1;
	for(int i=2;i<=n;i++)
	{
		iv[i]=(mod-mod/i)*iv[mod%i]%mod;
	}
	for(ll i=0;i<=n-1;i++)
	{
		ll cnt=1;ll val=0;
		for(ll k=0;i*k+k<=n;k++)
		{
			// if(n-i*k-k-1<0)break;
			val=(val+ cnt*iv[n-i*k]*( m1[k]%mod*(n-i*k-k)%mod*mm[max<int>(n-i*k-k-1,0)]%mod+k*m1[k-1]%mod*mm[n-i*k-k]%mod )%mod*C(n-i*k,k)%mod )%mod;
			val=(val+mod)%mod;
			// val=val*C(n-i*k,k)%mod;
			cnt=-cnt;
		}
		ans=(ans+val)%mod;
	}
	ans=ans*m%mod;
	ans=(n*mm[n]%mod-ans+mod)%mod;
	write(ans);
	return 0;
}
//10 2 998244353
//100 23333333 998244353

标签:11,ll,sum,ik,ans,define,csp,模拟,mod
From: https://www.cnblogs.com/wlesq/p/18464321

相关文章

  • Windows11下安装wsl报错:无法解析服务器的名称或地址
    问题描述之前在自己的笔记本电脑(Windows10)上下载安装WSL很顺利,具体教程见前面的文章,但是在新电脑(Windows11)上下载就报错:无法解析服务器的名称或地址,按照网上说的两个解决方案:修改 DNS 为手动114.114.114.114;查询 raw.githubusercontent.com 这个域名对应的能ping通的ip,......
  • Windows11右键菜单一取消/恢复Win11二级菜单
    Win11更新后,右键菜单很多功能使用时需要点击“显示更多选型”才能获取完整功能,以下有几种方法可以自动展开Win11的二级菜单,恢复到Win10模式。​方法一:reg1.按住win+R打开运行窗口​2.输入【regedit】进入注册表编辑器定位到以下位置:计算机\HKEY_CURRENT_USER\Software\Cl......
  • 1014 CW 模拟赛 B.旅行
    题面现在的题似乎都找不到原题了挂个pdf题面下载算法容易想到链和菊花图的做法,需要注意的是计算深度只能用\(\rm{dfs}\)来跑,不能保证链的顺序与输入顺序相同对于\(n,m\leq10^3\),观察暴力做法暴力容易发现对于每一个点,都要由起点\(1\)开始,先到达一条链......
  • 实战!oracle 11g一键安装脚本分享
    分享一个常用的数据库一键安装脚本,大家可以从我的网盘进行下载链接:https://pan.baidu.com/s/1iV-0zeXrwhJxJcm9qA_P_g提取码:apbc脚本内容:#!/bin/bash#一键安装oracle数据库#修改主机名hostnamectlset-hostnamemyoracle#添加主机名与IP对应记录public_ip=$(hostn......
  • 逍遥安卓模拟器命令行合集(memuc命令)
    逍遥安卓模拟器命令行合集(memuc命令)用cmd自行测试模拟器配合工具:memuc是v6.0.0版本推出的命令行工具,它封装了MEmuConsole、MEmu、MEmuManage的接口,支持多开管理、修改配置、android通信、adb命令等功能。memuc支持多个模拟器的管理,所以某些命令需要传入模拟器序号或者模......
  • YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
    一、本文介绍本文记录的是利用PPA(并行补丁感知注意模块)改进YOLOv11检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。PPA模块通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。......
  • <<迷雾>> 第11章 全自动加法计算机(6)--一只开关取数 示例电路
    用一只开关依次将数取出info::操作说明刚启动时,t0=1,t1=t2=0,此时只有IAR`=1.按下开关K不要松开,地址寄存器AR收到一个上升沿信号,保存住当前地址,并提供给存储器(注:第一个地址为0,所以电路中暂看不出什么变化)松开开关K,循环移位计数器RR得到......
  • 2024.10.14 1105版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 如何在 Windows 11 上恢复永久删除的文件
    在本文中,我将探讨如果您需要在Windows11上恢复数据,可以使用哪些选项,以及如何通过导航Windows11版本附带的界面来执行此操作。如何在Windows11上恢复已删除的文件文件恢复可以通过各种不同的方式执行。而且,在大多数情况下,它与您从Windows10恢复数据时所期望的非......
  • 如何清空回收站后在 Windows 11/10 中恢复已删除的文件
    这篇文章将解释如何将已删除的文件、文件夹和其他项目从回收站还原或恢复到原始位置。有时,我们最终会删除重要的文件和文件夹,然后我们不知道如何将它们恢复到原来的位置。但是您不必担心,因为这篇针对初学者的帖子将详细指导您完成所有步骤和方法。让我们首先看看如何以及在哪里......