首页 > 其他分享 >CF55D Beautiful numbers

CF55D Beautiful numbers

时间:2023-12-04 21:23:34浏览次数:35  
标签:Beautiful int times lst numbers CF55D ans include mod

题意

给定序列 \(S\)。

求满足以下性质的 \(S\) 的排列的数量:

\(\max_{j = 1} ^ {i - 1} s_j \ge 2 \times s_i\) 或 \(\max_{j = 1} ^ {i - 1} 2 \times s_j \le s_i\)。

Sol

排个序先。

设 \(f_i\) 表示我们从小到大往 \(s\) 里面填数,现在填的最大值为 \(s_i\) 的方案数。

不难想到如果我们当前填了 \(s_i\),考虑最大的 \(lst_i = j\) 满足 \(2 \times s_j \le s_i\),所有小于等于 \(lst_i\) 的数都已经被填了。

所以转移就很简单了:
\(f_i = \sum_{j = 0} ^ {lst_i} f_j \times A_{n - 2 - lst_j} ^ {lst_i - lst_j - 1}\)。

时间复杂度:\(O(n ^ 2)\)。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#define int long long
using namespace std;
#ifdef ONLINE_JUDGE
 
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;
 
#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
const int N = 5005, mod = 998244353;
 
namespace Mth {
 
int pow_(int x, int k, int p) {
	int ans = 1;
	while (k) {
		if (k & 1) ans = ans * x % p;
		x = x * x % p;
		k >>= 1;
	}
	return ans;
}
 
array <int, N> fac, inv;
 
void Mod(int &x) {
	if (x >= mod) x -= mod;
	if (x < 0) x += mod;
}
 
void init(int n) {
	fac[0] = 1;
	for (int i = 1; i <= n; i++)
		fac[i] = fac[i - 1] * i % mod;
	inv[n] = pow_(fac[n], mod - 2, mod);
	for (int i = n; i; i--)
		inv[i - 1] = inv[i] * i % mod;
}
 
int A(int n, int m) {
	if (m > n) return 0;
	return fac[n] * inv[n - m] % mod;
}
 
 
}
 
array <int, N> s, lst;
 
array <int, N> f;
 
 
signed main() {
	int n = read();
	for (int i = 1; i <= n; i++)
		s[i] = read();
	sort(s.begin() + 1, s.begin() + 1 + n);
	for (int i = 1; i <= n; i++) {
		lst[i] = lst[i - 1];
		while (s[lst[i] + 1] * 2 <= s[i]) lst[i]++;
	}
	f[0] = 1, lst[0] = -1;
	Mth::init(n);
	/* write(Mth::fac[3] * Mth::inv[2] % mod), puts(""); */
	for (int i = 1; i <= n; i++)
		for (int j = 0; j <= lst[i]; j++)
			f[i] += f[j] * Mth::A(n - lst[j] - 2, lst[i] - lst[j] - 1) % mod, Mth::Mod(f[i]);
	if (lst[n] != n - 1) puts("0");
	else write(f[n]), puts("");
	return 0;
}

标签:Beautiful,int,times,lst,numbers,CF55D,ans,include,mod
From: https://www.cnblogs.com/cxqghzj/p/17876024.html

相关文章

  • 无涯教程-Erlang - Numbers(数字)
    在Erlang中,有两种数字类型:整数(integers)和浮点数(floats)。整数示例:-module(helloLearnfk).-export([start/0]).start()->io:fwrite("~w",[1+1]).上面程序的输出如下:2浮点数示例:-module(helloLearnfk).-export([start/0]).start()->io:fwrite("~......
  • Count Beautiful Substrings II
    CountBeautifulSubstringsIIYouaregivenastring s andapositiveinteger k.Let vowels and consonants bethenumberofvowelsandconsonantsinastring.Astringis beautiful if:vowels==consonants.(vowels*consonants)%k==0,inothert......
  • Python + BeautifulSoup 采集
    Python是一种非常流行的编程语言,也是开发网络爬虫和数据采集工具的首选语言。在Python中,有许多第三方库可以用于网络爬虫和数据采集,比如requests、beautifulsoup4、selenium等。下面是一个简单的例子,使用requests库采集一个网页:importrequests#发送GET请求response=......
  • Netherlands: Soil Protection Act to keep tulips beautiful
      SoilpollutionmanagementintheNetherlands hasthreecharacteristics. Althoughthenaturalenvironment,populationanddevelopmentconditionsoftheNetherlandsareverydifferentfromthoseofChina,throughthedevelopmenttransformationandec......
  • 实验八. urllib模块、requests模块+BeautifulSoup模块使用、Feapder框架
    一、实验目标:熟悉模块的的用法,练习编写爬虫二、实验要求:编写代码,完成功能三、实验内容:(1)使用urllib模块或request模块读取网页内容,并利用BeautifulSoup模块进行内容解析,编写爬虫从http://www.cae.cn/cae/html/main/col48/column_48_1.html爬取中国工程院院士信息模......
  • Protobuf - FIELD NUMBERS
    Requiredfieldsinamessagecanbethoughtofasfrequentlyusedfieldssinceyoucannotskipthemasyoucanforoptionalfields.Itisabestpracticetoreservesomenumbers between1and15forthefieldsthatcanbefrequentlyusedsincethenumbers......
  • [题解] P4755 Beautiful Pair
    P4755BeautifulPair给你一个长度为\(n\)的序列\(a\),求有多少个区间\([l,r]\)满足\(a_l\cdota_r\le\max_{i=l}^ra_i\)。\(n\le10^5,a_i\le10^9\)。首先按最大值位置分治。记当前分治区间为\([l,r]\),分治中心为\(mid\)。那么我们现在要做的就是统计跨......
  • 无涯教程-Dart - Numbers(数值)
    Dartnumber可以归类为-int    -  任意大小的整数。double -  64位(双精度)浮点数,由IEEE754标准指定,double数据类型用于表示小数语法-intvar_name;//声明一个整型变量doublevar_name;//声明一个双精度变量voidmain(){intnum......
  • python中BeautifulSoup库使用小结
    转载请注明出处:BeautifulSoup是一个用于解析HTML和XML文档的Python库,它提供了一些简单但强大的API,让你可以从文档中提取数据。以下是一些BeautifulSoup的主要特性和功能:解析HTML和XML文档:BeautifulSoup可以解析HTML和XML文档,并创建一个BeautifulSoup对象,这个对象表示整个......
  • Required request parameter 'numbers' for method parameter type String[] is not p
    报错就是这个,然后报错的信息再给点详细的 org.springframework.web.bind.MissingServletRequestParameterException:Requiredrequestparameter'numbers'formethodparametertypeString[]isnotpresent atorg.springframework.web.method.annotation.RequestParam......