首页 > 其他分享 >CF1781D 解题乱弹

CF1781D 解题乱弹

时间:2023-02-11 21:58:57浏览次数:64  
标签:CF1781D 乱弹 复杂度 int 枚举 解题 X1 我们 define

abc1057510554 老师说,搞这种数论题,就可以在 CF 上 number theory 板刷一个 1300-1900 就可以了。

然后发现连 1800 的题都做不出来,我可以退役力 QAQ


观察到 \(n\) 很小,也就是说我们甚至可以用 \(O(n^4)\) 的算法爆过去,但是这是一道数论题,不是让我们用暴力乱堆堆过去的,所以我们来考虑一下性质。

平方和和加法运算能有什么关系呢……没有关系啊……反正我们 \(n\) 很小,我们可以枚举一下 \(a\) 的元素。首先我们达成共识答案肯定至少为 \(1\),然后我们看看答案能否为 \(2\)——枚举一个 \(a_i, a_j(a_i > a_j)\)。

我们令 \(a_i + x = p^2, a_j + x = q^2,a_i - a_j = p^2 - q^2 = (p+q)(p - q)\)

这下就明晰了!枚举 \(a_i, a_j(a_i > a_j)\),对它们差枚举因子,就能搞出来 \(p, q\),进而就可以计算出 \(x\),然后对整个序列都用这个 \(x\) 计算一遍就好了。

时间复杂度?枚举 \(a_i, a_j\) 是 \(O(n^2)\),质因子 \(O(\sqrt{SIZE})\)(当然达不到这个复杂度),最后再统计一下是 \(O(n)\) 的,总共的时间复杂度就是 \(O(n^3\sqrt{SIZE})\)。这是理论上界,实践是远远达不到的,因为 \(a_i - a_j\) 不可能永远都顶到 \(1e9\)。跑不满,\(n\) 又很小,问题不大 qwq。

//SIXIANG
#include <iostream>
#include <cmath> 
#define MAXN 100000
#define int long long
#define QWQ cout << "QWQ" << endl;
using namespace std;
int a[MAXN + 10], ans = 0, n;
bool judge(int x) {
	int st = sqrt(x);
	return (st * st == x);
} 
void count(int x) {
	int cnt = 0;
	for(int p = 1; p <= n; p++)
		cnt += judge(a[p] + x);
	ans = max(ans, cnt);
}
void work(int x, int id1, int id2) {
	for(int i = 1; i * i <= x; i++) {
		if(x % i == 0) {
			int j = x / i;
			if(!((i + j) & 1)) {
				int p = (i + j) / 2;
				int q = j - p;
				int X1 = p * p - a[id1], X2 = q * q - a[id2];
				if(X1 == X2 && X1 >= 0)//X 要大于等于 0,而且 p^2 - a[i] 要等于 q^2 - a[j]
					count(X1);
				
				swap(p, q);
				X1 = p * p - a[id1], X2 = q * q - a[id2];
				if(X1 == X2 && X1 >= 0)
					count(X1);
			}
		}
	}
}
void init() {
	ans = 0;
	cin >> n;
	for(int p = 1; p <= n; p++)
		cin >> a[p];
	for(int p = 1; p <= n; p++)
		for(int i = p + 1; i <= n; i++) {
			int x = a[p] - a[i], cp = p, ci = i;
			if(x < 0) x = -x, swap(cp, ci);
			work(x, cp, ci);
		}
	cout << max(ans, 1ll) << endl;
}
signed main() {
	int T; cin >> T;
	while(T--) {
		init();
	}
}

标签:CF1781D,乱弹,复杂度,int,枚举,解题,X1,我们,define
From: https://www.cnblogs.com/thirty-two/p/17112632.html

相关文章

  • 剑指 Offer 32 - I. 从上到下打印二叉树(java解题)
    目录1.题目2.解题思路3.数据类型功能函数总结4.java代码1.题目从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 例如:给定二叉树: [3,9,......
  • 「解题报告」[省选联考 2021 A 卷] 矩阵游戏
    啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会了!啥都不会......
  • [POI2011]MET-Meteors 解题报告
    语言系统紊乱了QAQ这道题感觉不是很难鸭qwq。先只考虑一个国家,怎么做?很显然,就直接二分一下就行了。判定答案可以维护一个差分数组,然后最后对它做一个前缀和,再求一下这......
  • USACO23 JAN 解题报告
    T1FindandReplaceG个人思路:从后往前做,每次修改,替换前一个修改里面的字母,显然是错的,因为没替换更前面的字母。然后就想不出来了。正解:第\(i\)次修改\(c,s\),相当......
  • 「解题报告」[省选联考 2022] 序列变换
    我不是很能理解?神奇贪心题。括号序列考虑直接整树形结构,然后操作就是将一个子树内所有儿子放到另一颗子树里,并把这个点单独放到这个子树内,贡献为\(x\)乘终点子树权值加......
  • loj#6739. 圆环之理 解题报告
    发现之前写过这题题解,今天突然记起这道题就发出来一下。其实基本上是复读一遍EI题解(题意一个长度为\(n\)的环上等距排列\(n\)个点,任意两点之间均有一条无向边。每......
  • 蓝桥杯题目——飞行员兄弟解题详解及其包含的思想
    前言本文介绍蓝桥杯题目——飞行员兄弟的解题方法及其包含的代码思想。题目信息“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。已知每个把手可以......
  • 「解题报告」[省选联考 2022] 卡牌
    放假上午想出的做法,写了一下TLE35分。以为有更高级的复杂度,然后刚看了看题解发现题解就是这个复杂度,呃呃,卡常吧。考虑将每个数写成它所包含的质因子的集合,写成一个0......
  • P2617 Dynamic Rankings 解题报告
    link整体二分是一种东西,比如上面这道题。先考虑一个不带修版本的,也就是经典问题区间kth,显然我们可以主席树但是我知道你很想用主席树但是你先别用不用主席树,用一种离线......
  • 【题解】20230204解题报告
    解题报告20230204主要学习内容有:动态规划,字符串操作(在另外一篇文章里)T1:P5322[BJOI2019]排兵布阵首先题意是设定有n座城堡,s个玩家(不包括特殊玩家),此时每名玩家都有m......