首页 > 其他分享 >[CF1603E] A Perfect Problem

[CF1603E] A Perfect Problem

时间:2023-12-12 16:00:14浏览次数:27  
标签:Perfect perfect le sum 样例 CF1603E 序列 Problem ldots

A Perfect Problem

题面翻译

一个序列是好的当且仅当集合最大值乘上集合最小值大于等于集合元素的加和;

一个序列是完美的,当且仅当这个序列的任何子序列都是好的(包括自己不包括空集);

你要求的是:长度为 \(n\) 的并且每一个元素都大于等于 \(1\) 并且小于等于 \(n+1\) 的完美序列的个数对 \(\mathrm{mod}\) 取模。

题目描述

A sequence of integers $ b_1, b_2, \ldots, b_m $ is called good if $ max(b_1, b_2, \ldots, b_m) \cdot min(b_1, b_2, \ldots, b_m) \ge b_1 + b_2 + \ldots + b_m $ .

A sequence of integers $ a_1, a_2, \ldots, a_n $ is called perfect if every non-empty subsequence of $ a $ is good.

YouKn0wWho has two integers $ n $ and $ M $ , $ M $ is prime. Help him find the number, modulo $ M $ , of perfect sequences $ a_1, a_2, \ldots, a_n $ such that $ 1 \le a_i \le n + 1 $ for each integer $ i $ from $ 1 $ to $ n $ .

A sequence $ d $ is a subsequence of a sequence $ c $ if $ d $ can be obtained from $ c $ by deletion of several (possibly, zero or all) elements.

输入格式

The first and only line of the input contains two space-separated integers $ n $ and $ M $ ( $ 1 \le n \le 200 $ ; $ 10^8 \le M \le 10^9 $ ). It is guaranteed that $ M $ is prime.

输出格式

Print a single integer — the number of perfect sequences modulo $ M $ .

样例 #1

样例输入 #1

2 998244353

样例输出 #1

4

样例 #2

样例输入 #2

4 100000007

样例输出 #2

32

样例 #3

样例输入 #3

69 999999937

样例输出 #3

456886663

提示

In the first test case, the perfect sequences are $ [2, 2] $ , $ [2, 3] $ , $ [3, 2] $ and $ [3, 3] $ .

In the second test case, some of the perfect sequences are $ [3, 4, 3, 5] $ , $ [4, 5, 4, 4] $ , $ [4, 5, 5, 5] $ etc. One example of a sequence which is not perfect is $ [2, 3, 3, 4] $ , because, for example, the subsequence $ [2, 3, 4] $ is not an good as $ 2 \cdot 4 < 2 + 3 + 4 $ .
性质1:如果一个序列是完美的的,当且仅当他排序后所有子区间是好的。
显然。后面考虑时都是把 \(a\) 排序后考虑。

性质2:如果一个序列是完美的的,当且仅当他排序后所有前缀是好的。

进一步的,设整个序列的最小值为 \(l\),现在考虑前 \(r\) 个数。那么如果一个序列中所有在 \([l,r]\) 中的数的和不超过 \(lr\),这个序列是好的。因为如果把 \(l\) 加1,(l+1)r,变大,和变小,一定仍然符合要求。


于是我们就有一个 \(O(n^6)\) 的算法。枚举全局最小值,定义 \(dp_{j,s,k}\) 表示现在考虑第 \(j\) 个数,前面的数和为 \(j\),目前选了 \(k\) 个数。枚举第 \(j\) 个数选了多少个(顺便检查一下条件)。

性质4:\(\forall i,a_i\ge i\)
\(a_1\times i\le\sum\limits_{j=1}^ia_j\le a_1\times a_i\)。
性质5:如果 \(a_i=i\),那么\(\forall j<i,a_j=i\)
\(a_1i\le\sum\limits_{k=1}^ia_k\le a_1i,a_1=a_2=\cdots =s_k\)

于是分类讨论 \(a_n=n\) 和 \(a_n=n+1\),前者答案为1(性质5得),现在讨论后者
性质6:\(\sum\limits_{i=1}^n(a_i-a_1)\le n\)

\[a_1n+\sum\limits_{i=1}^n(a_i-a_1)\le a_1a_n=a_1(n+1) \]

\[\sum\limits_{i=1}^n(a_i-a_1)\le a_1\le n \]

现在就可以把和那一位的复杂度改成 \(n\),而且枚举的总量为调和级数的,所以复杂度打到了 \(O(n^4log n)\)

性质7:\(a_1\ge n-2\sqrt{n}\)

\(\sum a_i\) 最小是多少?构造应该是 \(a_1\) 个 \(a_1\) 后面跟 \(a_1+2,a_1+3\cdots n+1\),它们的和为 $$a_1^2+\frac12(a_1+n+3)(n-a_1)\le a_1(n+1)$$

\[a_1^2+n^2\le 2a_1(n+1) \]

\[(n-a_1)^2\le 2a_1 \]

所以枚举最小值的复杂度缩减为 \(O(\sqrt{n})\),总复杂度 \((n^3\sqrt nlog n )\)

#include<bits/stdc++.h>
using namespace std;
const int N=205; 
int n,P,dp[N][N],f[N],ans,inv[N],jc;//dp[j][k] 表示选了j个,和为k-j*mn的方案数 
int main()
{
	scanf("%d%d",&n,&P);
	inv[1]=f[0]=f[1]=jc=1;
	for(int i=2;i<=n;i++)
	{
		jc=1LL*jc*i%P;
		inv[i]=1LL*(P-P/i)*inv[P%i]%P;
		f[i]=1LL*f[i-1]*inv[i]%P; 
	}
	for(int i=max(n-32,1);i<=n;i++)//枚举最小值 
	{
		memset(dp,0,sizeof(dp));
		for(int j=1;j<=i;j++)
			dp[j][0]=f[j];
		for(int j=i+1;j<=n;j++)
		{
			for(int k=j;k;k--)
			{
				for(int s=min(i,i*(j-k));~s;s--)
				{
					for(int c=1;c<=k&&c*(j-i)<=s;c++)
						(dp[k][s]+=1LL*dp[k-c][s-c*(j-i)]*f[c]%P)%=P;
				}
			}
		}
		
		for(int j=1;j<n;j++)
			for(int k=0;k<=i;k++)
				if(k+1LL*(n-j)*(n+1-i)<=i)
					(ans+=1LL*dp[j][k]*f[n-j]%P)%=P;
	}
	printf("%lld",2+ans*1LL*jc%P);
}

标签:Perfect,perfect,le,sum,样例,CF1603E,序列,Problem,ldots
From: https://www.cnblogs.com/mekoszc/p/17897099.html

相关文章

  • 【UVA 101】The Blocks Problem 题解(模拟+向量)
    计算机科学的许多领域使用简单、抽象的领域进行分析和实证研究。例如,早期的人工智能规划和机器人研究(STRIPS)使用了一个区块世界,其中机器人arm执行涉及块操作的任务。在这个问题中,您将在某些规则和约束下对一个简单的块世界进行建模。相当地与确定如何达到指定状态相比,您将“编程......
  • uva101The Blocks Problem
    原题链接TheBlocksProblem-洛谷|计算机科学教育新生态(luogu.com.cn)一道模拟题。(水题) 但模拟过程很有意思,怎么样才能用最短的代码完成所有操作,使代码更简洁是很考验技术的。 #include<bits/stdc++.h>usingnamespacestd;vector<int>block[30];vector<int>m;......
  • 关于解决vue报错"Problems loading reference 'https://schemastore.azurewebsites.ne
    打开setting时会看到有一条三角形的警告信息 看问题描述:无法从该网站加载解决方法:打开设置,找到扩展下的json项 设置之后可以在settings.json文件中看到新增加一项 "json.schemaDownload.enable":false可以直接在界面上设置: "json.schemaDownload.enable":false......
  • P2522 [HAOI2011] Problem b
    题意求\(\sum_{i=a}^{b}\sum_{j=c}^{d}[\gcd(i,j)=k]\)。Sol简单容斥一下。\[\begin{aligned}\sum_{i=a}^{b}\sum_{j=c}^{d}[\gcd(i,j)=k]&=\sum_{i=1}^{b}\sum_{j=1}^{d}[\gcd(i,j)=k]\\&-\sum_{i=1}^{b......
  • Problem: E. Chocolate Bar
    题意:给定一个nm个方块组成的巧克力块,最终要吃到k个方块有两种切的方式:(nm)1.横着切,成本是mm2.竖着切,成本是nn做法:考虑记忆化搜索,使用dp[n][m][k]代表一个n*m的巧克力最后要得到k块所需要的最小成本状态转移:把每一次切的动作看作是一次转移:以n,m,k为例1.横着切,那么每......
  • Problem: B. Queries on a String
    题意简述:给出一个字符串,每次给定l,r,k,选择一个子串l-r,然后子串向右移动k个单位.做法:每次k对子串的长度取模,然后模拟即可(使用substr函数截取前半段和后半段,交换前半段和后半段即可)点击查看代码//Problem:B.QueriesonaString//Contest:Codeforces-EducationalCo......
  • Problem: A. Tricky Sum
    A:做法:数据比较小,用求和公式(n+1)*n/2,减去所有2的幂即可点击查看代码//Problem:A.TrickySum//Contest:Codeforces-EducationalCodeforcesRound1//URL:https://codeforces.com/contest/598/problem/A//MemoryLimit:256MB//TimeLimit:1000ms//Aut......
  • 论文:FEED-FORWARD NETWORKS WITH ATTENTION CAN SOLVE SOME LONG-TERM MEMORY PROBLEM
    题目:FEED-FORWARDNETWORKSWITHATTENTIONCANSOLVESOMELONG-TERMMEMORYPROBLEMS”(Raffel和Ellis,2016,p.1)“带有注意力的前馈网络可以解决一些长期记忆问题”(Raffel和Ellis,2016,p.1)(pdf)这篇论文提出了一种适用于前馈神经网络的简化注意力模型,并展示了......
  • The Design of Feedback Control Systems--Advanced Problems
    AP10.1Athree-axispick-and-placeapplicationrequirestheprecisemovementofaroboticarminthree-dimensionalspace,asshowninFigureAP10.1forjoint2.Thearmhasspecificlinearpathsitmustfollowtoavoidotherpiecesofmachinery.Theovers......
  • [ABC315Ex] Typical Convolution Problem
    题目链接首先观察到这个形式,容易发现它和常规的卷积不同点就在于:题目给出的求和定义中,\(\sum\)符号下面的式子是\(i+j<N\)求和而不是\(i+j=N\)。为了方便计算,我们引入:\[G_n=\sum_{i+j<N}F_iF_j\]我们发现,假设所有\(F_{1\sim{i-1}}\)已经求解完毕了,那么我们就可以通过之......