csp-s模拟11

news/2024/10/14 16:32:14

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

高等数学 5.1 定积分的概念与性质

目录一、定积分的定义1.定义2.定积分的几何意义二、定积分的近似计算1.矩形法2.梯形法3.抛物线法三、定积分的性质 一、定积分的定义 1.定义定义 设函数 \(f(x)\) 在 \([a, b]\) 上有界,在 \([a, b]\) 中任意插入若干个分点 \[a = x_0 < x_1 < x_2 < \cdots < x_{…

PARTI-Oracle关系数据结构-索引和索引组织表

3. 索引和索引组织表 3.1. 索引概述 索引是与表或表簇关联的可选结构,有时可以加快数据访问速度。通过在表的一个或多个列上创建索引,在某些情况下,可以从表中检索一小部分随机分布的行。索引是减少磁盘I/O的众多方法之一。如果堆组织表没有索引,那么数据库必须执行全表扫描…

5分钟学会使用Linux的 grep、find、ls、wc 命令

01 概述 本系列主要讲解Linux运行时命令,包括网络、磁盘、内存、CPU相关参数等,主要是为了分享怎么通过常见的 Linux 命令去排查相关问题。比如:发现机器的CPU负荷比较高,那么怎么查到是哪个进程CPU占用率比较高?磁盘IO的写入很频繁,怎么查到是哪个进程或线程对磁盘IO频…

python3.6 解析svg保存到mysql

1 import json2 from collections import Counter3 from json import JSONDecodeError4 5 import mysql6 import requests7 from lxml import etree8 9 # 定义远程 SVG 文件的 URL10 file = rD:\tmp_files\jmx\0919_3568.txt11 data_to_insert=[]12 with open(file, r, encodin…

数字游民和远程办公必备的软件!

现在数字游民和远程办公逐渐成为很多年轻人的工作方式 小编搜罗到一个宝藏远程软件ToDesk🆕 让你能身在异地轻松远程控制各种电子设备 实现游玩和工作两不误😎 🔵ToDesk的功能优点有哪些? 1️⃣不限设备和系统,跨界连接超方便 支持PC端-Windows、MacOS、Linux,移动端安…

云电脑玩赛博朋克2077必备三个条件,以ToDesk为例

云电脑近期成为不少用户玩游戏的首选,尤其是面对像《赛博朋克2077》这样硬件要求高的游戏时,价格实惠且性能极高的云电脑,简直是游戏玩家的福音。 市面上虽说有众多云电脑可供我们选择,但小编试用过这么多后还是最推荐ToDesk的云电脑。覆盖的系统够全面,3060和4070配置足够…

css实现的时间线

在一个英文博客上看到用css实现的时间线,看着还是很简单的,写个demo记录下。 <style>.events::before {content: "";position: absolute;top: 0;height: 100%;width: 1px;left: 50%;background: rgb(130, 129, 129);}.events {position: relative;margin: 0.…