首页 > 其他分享 >CodeForces 1497E2 Square-free division (hard version)

CodeForces 1497E2 Square-free division (hard version)

时间:2023-12-06 10:25:09浏览次数:32  
标签:1497E2 division typedef Square const int long maxm define

洛谷传送门

CF 传送门

感觉和 CF1889C2 Doremy's Drying Plan (Hard Version) 有异曲同工之妙。

显然去除每个数的平方因子后,两个数相乘为完全平方数当且仅当它们相等。

考虑若确定了分段方案,那么修改次数就是,每一段重复出现的数的个数。

那么我们设 \(f_{i, j}\) 为 \([1, i]\) 修改了 \(j\) 次的最小分段次数。然后我们枚举上一个分段点 \(k\),那么有 \(f_{i, j} \gets f_{k, j - g(k + 1, i)} + 1\),其中 \(g(l, r)\) 为 \([l, r]\) 中重复出现的数的个数。

显然对于一个 \(j\),\(f_{\ast, j}\) 单调不降,那么我们可以找到 \(\forall p \in [0, m]\),使得 \(g(k + 1, i) = p\) 的 \(k\) 的最小值,然后直接从这个 \(k\) 转移过来。

时间复杂度就是 \(O(nk^2)\)。去除平方因子我写了 \(O(n \sqrt{V})\),也能过。

code
// Problem: E2. Square-Free Division (hard version)
// Contest: Codeforces - Codeforces Round 708 (Div. 2)
// URL: https://codeforces.com/problemset/problem/1497/E2
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 200100;
const int maxm = 3300;
const int N = 3200;

int n, m, a[maxn], pr[maxm], tot, b[maxm], f[maxn][22];
bool vis[maxm];

inline void init() {
	for (int i = 2; i <= N; ++i) {
		if (!vis[i]) {
			pr[++tot] = i;
			b[tot] = i * i;
		}
		for (int j = 1; j <= tot && i * pr[j] <= N; ++j) {
			vis[i * pr[j]] = 1;
			if (i % pr[j] == 0) {
				break;
			}
		}
	}
}

void solve() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
		for (int j = 1; j <= tot && b[j] <= a[i]; ++j) {
			while (a[i] % b[j] == 0) {
				a[i] /= b[j];
			}
		}
	}
	map<int, int> mp;
	set<int> S;
	S.insert(0);
	for (int i = 1; i <= n; ++i) {
		if (mp.find(a[i]) != mp.end()) {
			S.insert(mp[a[i]]);
		}
		mp[a[i]] = i;
		auto it = S.end();
		vector<int> vc;
		do {
			vc.pb(*(--it));
		} while (it != S.begin() && (int)vc.size() <= m);
		for (int j = 0; j <= m; ++j) {
			f[i][j] = 1e9;
		}
		for (int j = 0; j < (int)vc.size(); ++j) {
			for (int k = j; k <= m; ++k) {
				f[i][k] = min(f[i][k], f[vc[j]][k - j] + 1);
			}
		}
	}
	printf("%d\n", *min_element(f[n], f[n] + m + 1));
}

int main() {
	init();
	int T = 1;
	scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:1497E2,division,typedef,Square,const,int,long,maxm,define
From: https://www.cnblogs.com/zltzlt-blog/p/17878917.html

相关文章

  • RuCode 2020 Division A+B. I ✖ [PR #5] 和平共处
    前言认认真真学习了一下这道题相关的做法以及有关的二分图网络流理论,感觉自己又刷新了一些东西的理解。所以说我们就从普通的二分图匹配开始吧!二分图匹配众所周知,二分图最大匹配可以用网络流Dinic算法做到\(O(m\sqrtn)\)的复杂度。在某些特定的图下,我们有一种“贪心流”......
  • Python用偏最小二乘回归Partial Least Squares,PLS分析桃子近红外光谱数据可视化
    全文链接:https://tecdat.cn/?p=34376原文出处:拓端数据部落公众号PLS,即偏最小二乘(PartialLeastSquares),是一种广泛使用的回归技术,用于帮助客户分析近红外光谱数据。如果您对近红外光谱学有所了解,您肯定知道近红外光谱是一种次级方法,需要将近红外数据校准到所要测量的参数的主要......
  • 学习ESP32——使用SquareLine_Studio自定义一个UI界面学习ESP32——使用SquareLine_St
    原文:https://blog.csdn.net/Jeremyrev/article/details/131854181打开SquareLine_Studio软件,先生成一个项目,这里我选择乐鑫官方的板子 选择File→ProjectSettings选择导出的地址,点击APPLYCHANGES 完成后,先下载字体和图标进入阿里矢量图标官网   注册登录之后点......
  • 回声消除原理、算法-LMS(Least Mean Square)
    回声消除是语音通信前端处理中的一种重要技术,产生的原因是:在实时音视频通话中,扬声器播放的声音有再次录进了麦克风去。在即时通讯应用中,需要进行双方,或是多方的实时语音交流,在要求较高的场合,通常都是采用外置音箱放音,这样必然会产生回音,即一方说话后,通过对方的音箱放音,然后又被对......
  • 使用SquareLine Studio设计UI
    原文:http://www.bryh.cn/a/220739.htmlLVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发。LVGL中文教程手册:极客笔记之LVGL教程介绍:SquareLineStudio是LVG......
  • C++ signal(SIGFPE,handler) ignore division by 0 exception
    #include<stdexcept>#include<chrono>#include<csetjmp>#include<ctime>#include<fstream>#include<iostream>#include<iomanip>#include<signal.h>#include<sstream>#include<thread>#incl......
  • 最小二乘法 least square method
    最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最......
  • [ARC159F] Good Division 题解
    [ARC159F]GoodDivision题解首先对于题目要求的划分方式转化一下,转化为划分的每一段都没有绝对众数,可以证明这与题目中的要求是完全等价的,证明如下:充分性:考虑构造一种操作方法,就是每次操作都消去一个出现次数最多的数,按照这样操作可以保证每次操作之后该区间仍然不会出现绝对......
  • 003Square(n)Sum(8kyu)from codewars
    Square(n)SumCompletethesquaresumfunctionsothatitsquareseachnumberpassedintoitandthensumstheresultstogether.完成平方和函数,对每个传入其中的数字平方并相加。defsquare_sum(numbers):sums=0foriinnumbers:sums+=i*iretu......
  • Testing Round 16 (Unrated) B. Square?
    给定一个矩形,然后切成两个矩形。尺寸分别为\(a\timesb\),\(c\timesd\)。你需要确定开始的矩形是否可能是个正方形。假设初始矩形为正方形,则两个小矩形的长边是正方形的边长。不妨让\(a\geqb,c\geqd\)。只需判断\(a=c,a=b+d\)是否成立即可。view#includ......