【Codeforces】1109 Round #539 (Div. 1)B-F题解

传送门:CF1109


B.Sasha and One More Name

首先判断全部相同或是奇回文且只有 m i d mid mid不同的情况,无解。

如果是奇回文,至少都要切 2 2 2刀,且下界一定能达到。
如果是偶回文,不断把字符串长度 / 2 /2 /2(砍一半),直到出现奇回文或不回文子串:
若出现奇回文,还是至少切 2 2 2刀的情况,且下界一定能达到。
否则只用切一刀。

#include<bits/stdc++.h>
#define fl() puts("Impossible"),exit(0)
using namespace std;
const int N=5003;

int n;
char s[N];

int main(){
   
	int i,j,mid;
	scanf("%s",s+1);
	n=strlen(s+1);mid=n>>1;
	for(i=2;i<=mid && (s[i]==s[i-1]);++i);
	if(i>mid) fl();
	if(n&1) puts("2");
	else{
   
		for(;;mid>>=1){
   
			for(i=1;mid-i+1>i && (s[i]==s[mid-i+1]);++i);
			if((mid-i+1<=i) && (mid&1)) {
   puts("2");break;}
	 	    else if(mid-i+1>i){
   puts("1");break;}
		}
	}
	return 0;
	
}

C.Sasha and a Patient Friend

大概可以把 l , r l,r l,r离散化之后套个 s e t + 线 段 树 set+线段树 set+线
然而直接 B S T BST BST维护每次查询二分。

代码咕咕咕。


D.Sasha and Interesting Fact from Graph Theory

枚举 a , b a,b a,b链上的点数 k ( 0 ≤ k ≤ n − 2 ) k(0\leq k\leq n-2) k(0kn2)

选出 k k k个点的方案 ( n − 2 ) ! ( n − 2 − k ) ! \dfrac{(n-2)!}{(n-2-k)!} (n2k)!(n2)!,链上 k + 1 k+1 k+1条边边权方案 ( m − 1 k ) \dbinom{m-1}{k} (km1),剩下 n − k − 2 n-k-2 nk2条边边权的方案 m n − k − 2 m^{n-k-2} mnk2

关于怎么统计把剩下 n − 2 − k n-2-k n2k任意连向这条链的方案数,存在 Cayley’s formula \text{Cayley&#x27;s formula} Cayley’s formula
f ( n , k ) = k ⋅ n n − k − 1 f(n,k)=k·n^{n-k-1} f(n,k)=knnk1

n n n个点的森林 k k k个连通块,且 1 , 2 , . . . , k 1,2,...,k 1,2,...,k在不同连通块中的方案数。
数学归纳法证明-ymz

a n s = ∑ k = 0 n − 2 ( n − 2 ) ! ( n − 2 − k ) ! ( m − 1 k ) m n − k − 2 f ( n , k + 2 ) ( m o d 1 0 9 + 7 ) ans=\sum \limits_{k=0}^{n-2}\dfrac{(n-2)!}{(n-2-k)!}\dbinom{m-1}{k}m^{n-k-2}f(n,k+2) \pmod {10^9+7} ans=k=0n2(n2k)!(n2)!(km1)mnk2f(n,k+2)(mod109

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值