首页 > 其他分享 >2024年多校联考公益周赛第29场(提高级)

2024年多校联考公益周赛第29场(提高级)

时间:2024-09-03 22:24:50浏览次数:11  
标签:周赛 类数 int bmod 多校 times fac 联考 equiv

赛时:\(0+0+0\)。

补题:\(100+100+0\)。

T1

hash 即可。

code
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;

const int N=1e4+5;
const int P=13331;
string s,t;
int m,ss,tt,ans;
ull ps[N],pt[N],hss[N],hst[N];

void hss_init(){
    ps[0]=1;
	for(int i=1;i<=ss;i++){
		hss[i]=hss[i-1]*P+s[i];
        ps[i]=ps[i-1]*P;
    }
}
void hst_init(){
	pt[0]=1;
	for(int i=1;i<=tt;i++){
		hst[i]=hst[i-1]*P+t[i];
		pt[i]=pt[i-1]*P;
	}
}
ull hss_get(int l,int r){
	return hss[r]-hss[l-1]*ps[r-l+1];
}
ull hss_del(int x){
	return hss_get(1,x-1)*ps[ss-x]+hss_get(x+1,ss);
}
ull hst_get(int l,int r){
	return hst[r]-hst[l-1]*pt[r-l+1];
}
ull hst_del(int x){
	return hst_get(1,x-1)*pt[tt-x]+hst_get(x+1,tt);
}

int main(){
	ios::sync_with_stdio(0);
	cin>>s>>m;
	ss=s.size();
	s="#"+s;
	hss_init();
	while(m--){
		cin>>t;
		tt=t.size();
		t="#"+t;
		hst_init();
        if(hss[ss]==hst[tt]){
            ans++;
            continue;
        }
		bool f=0;
        if(ss<tt){
		    for(int i=1;i<=tt;i++){
			    if(hst_del(i)==hss[ss]){
				    f=1;
				    break;
			    }
		    }
        }
        else{
            for(int i=1;i<=ss;i++){
			    if(hss_del(i)==hst[tt]){
				    f=1;
				    break;
			    }
		    }
        }
		if(f)
			ans++;
	}
	cout<<ans;
	return 0;
}

考场寄因:没开 freopen,并且 没提交

T2

数数题。

首先题目应该是有个错误,就是要求应该是漂亮值 \(\ge d\)。

考虑边界情况:

  • \(k=0\),答案为 \(n!\)。

  • \(k=n\),若 \(d=0\),答案为 \(n!\),否则为 \(0\)。

接着,我们考虑将 \(>k\) 的数称为 II 类数,其余称为 I 类数。

不妨将连在一起的同一类数看成一个数(一个联通块),这样答案只要在乘上 \(k!(n-k)!\)(就是它们内部的排列总数) 即可。

令总联通块个数为 \(p\)。显然,一个联通块若有 \(n\) 个 II 类数,则其贡献即为 \(n-1\),\(p\) 个联通块的总贡献为 II 类元素个数 \(- \ p\),即 \(n-k-p\)。

由题,\(n-k-p \ge d \to n-k-d \ge p\),得到 \(p \in [1,n-k-d]\),于是枚举 \(p\) 再进行计算。

对于每一个 \(p\),我们可以选出一个 I 类数(反正不会影响答案)单独作为一个联通块,贡献为 \(n\);然后 II 类数 与 I 类数 就交替形成联通块,使用插板法即可求解分的方案数,贡献即为 \(\dfrac{n \times C^{k-1}_{p-1} \times C^{n-k-1}_{p-1}}{p}\)(第一个操作相当于删去了一个联通块,对于每一种方案,都有 \(p\) 中删除方式,而只能对应一个,因此要除以 \(p\)),简单画一下图便可理解上式。

组合数预处理一下阶乘、逆元和阶乘逆元就可以 \(O(1)\) 求出了。

正好有点忘了,补充一下怎么线性求逆元。

求 \(b\) 在 \(\bmod \ p\) 意义下的逆元:

令 \(k = \lfloor \frac{p}{i} \rfloor,r=p \bmod i\)。

于是有 \(k \times i + r \equiv 0(\bmod \ p)\)。

移项:\(k \times i \equiv -r(\bmod \ p)\)

两边 \(\times \ i^{-1} \times r^{-1}\):\(k \times r^{-1} \equiv -i^{-1}(\bmod \ p)\)。

移项:\(i^{-1} \equiv -k \times r^{-1}(\bmod \ p)\)。

替换:\(i^{-1} \equiv -\lfloor \frac{p}{i} \rfloor \times (p \bmod i)^{-1}\)。

为保证 \(i^{-1}\) 为正,右边 \(+ \ p\):\(i^{-1} \equiv (p -\lfloor \frac{p}{i} \rfloor) \times (p \bmod i)^{-1}\)。

然后就可以递推了。

code
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e6+5;
const int MOD=998244353;
int t,n,k,d;
int fac[N],inv[N],inv_fac[N];

void fac_init(){
	fac[0]=inv[1]=inv_fac[0]=1;
	for(int i=1;i<N;i++)
		fac[i]=fac[i-1]%MOD*i%MOD;
	for(int i=2;i<N;i++)
		inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
	for(int i=1;i<N;i++)
		inv_fac[i]=inv_fac[i-1]%MOD*inv[i]%MOD;
}
int C(int x,int y){
    if(y<0||x<y)
        return 0;
	return fac[x]%MOD*inv_fac[y]%MOD*inv_fac[x-y]%MOD;
}

signed main(){
	ios::sync_with_stdio(0);
	cin>>t;
	fac_init();
	while(t--){
		cin>>n>>k>>d;
		if(!k){
			cout<<fac[n]<<'\n';
			continue;
		}
		else if(k==n){
			if(!d)
                cout<<fac[n]<<'\n';
            else
                cout<<0<<'\n';
			continue;
		}
		int ans=0;
		for(int p=1;p<=n-k-d;p++){
            if(p==1)
                ans=(ans+n)%MOD;
            else
			    ans=(ans+n%MOD*C(k-1,p-1)%MOD*C(n-k-1,p-1)%MOD*inv[p]%MOD)%MOD;
        }
		ans=ans%MOD*fac[k]%MOD*fac[n-k]%MOD;
		cout<<ans<<'\n';
	}
	return 0;
}

考场寄因:没有考虑 \(\ge d\) 这个条件。

T3

skip,不补了。

总结

  • 要持之以恒地打周考,才能避免保龄的情况。

  • 审题。

标签:周赛,类数,int,bmod,多校,times,fac,联考,equiv
From: https://www.cnblogs.com/XOF-0-0/p/18395588

相关文章

  • 2024杭电多校08-1008《cats 的数据结构》
    题目链接Problem-7524分析:我们发现最重要的一个条件是:父节点的ai,bi都会比子节点的ai,bi(对应)大。那么单独考虑ai,可以发现,按dfs序是可以办到“父——>子”这一过程的。题目又限制父子节点关系和ai,bi大小关系是充要条件,那么不能把A的儿子ai,bi设的“太小”使其错误地......
  • 周赛413场 个人总结
    第1题 代码 """根据a的ascii码值是97奇数黑色的规律是:a1是97+1=偶数b2是98+2=偶数c1是99+1=偶数d2是100+2=偶数...所以,偶数为黑色===白色的规律a2=97+2=奇数b1=98+1=奇数....所以,奇数为白色"""classSolution:defche......
  • Leetcode 第 408 场周赛题解
    Leetcode第408场周赛题解Leetcode第408场周赛题解题目1:3232.判断是否可以赢得数字游戏思路代码复杂度分析题目2:3233.统计不是特殊数字的数字数量思路代码复杂度分析题目3:3234.统计1显著的字符串的数量思路代码复杂度分析题目4:3235.判断矩形的两个角落是否......
  • 2024 牛客多校 6
    https://ac.nowcoder.com/acm/contest/81601#questionB-Cake2考虑平面图欧拉定理:\(V-E+F=2\)每条线段相交的数量可以由小的那一侧顶点数推出,\(k\ne\frac{n}{2}\)时有\(V=2\min(k-1,n-k-1)\timesn\times\frac{1}{2},E=2\min(k-1,n-k-1)\timesn\)也可以打表C-Cake3......
  • 牛客周赛 Round 57
    A-小红喜欢1#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingi128=__int128;usingvi=vector<int>;usingpii=pair<int,int>;constintinf=INT_MAX/2;i32main(){ios::sync_w......
  • 牛客周赛 Round 57
     B可以直接统计每条边两个点的情况即可,不用DFS。  F写法和这个差不多。可以用map、set、统计这些方法,计算动态的一个数组的最大数。可以直接用map统计就行,map已经自动给你排好序了(从小到大)。1#include<bits/stdc++.h>2usingnamespacestd;3#defineLLl......
  • 2024牛客暑期多校训练营10
    ASurrendertoMyWill签到题Bstd::pair模拟,建立二叉树即可DIsitrated?题目大意有\(n\)场\(\textbf{按顺序}\)的比赛,第\(i\)场比赛有表现分\(p_i\)。参加第\(i\)场比赛后你的分数\(r\)将变为\(r\times(1-k)+k\timesp_i\)。你可以选择最多\(m\)场比赛不参......
  • 牛客周赛 Round 57 D-小红的线段(贪心)
     示例1输入2-1200011011输出112N34Y说明连接第一个点和第二个点,和直线没有交点。连接第三个点和第四个点,和直线有交点。 贪心策略:把点集分为三部分,直线上方m1、直线下方m2以及在直线上m3,我们可以发现:m1中的点和m2中的任意点相连都能通过直线;m3......
  • 牛客周赛 Round 57
    无A.小红喜欢1题意:输出1的位置Code:#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidsolve(){for(inti=1,x;i<=5;++i){cin>>x;if(x)cout<<i;}}intmain(){cin.tie......
  • 2024暑期牛客多校第10场 D Is it rated?
    题目大意有\(n\)场\(\textbf{按顺序}\)的比赛,第\(i\)场比赛有表现分\(p_i\)。参加第\(i\)场比赛后你的分数\(r\)将变为\(r\times(1-k)+k\timesp_i\)。你可以选择最多\(m\)场比赛不参加。给定初始分数\(r_0\)和参数\(k\)。问经过至少\(n-m\)场比赛后,分数最高是......