首页 > 其他分享 >题解:P10724 [GESP202406 七级] 区间乘积

题解:P10724 [GESP202406 七级] 区间乘积

时间:2024-08-21 09:49:16浏览次数:13  
标签:前缀 二进制 题解 long times int GESP202406 P10724 每个

思路

当一个数是完全平方数的时候,它的所有质因子的次数都是偶数。

记 \(x\) 的质因子为 \(p_1^{q1} \times p_2^{q2} \times p_3^{q3} ... \times p_v^{qv}\)。这些数可以通过次数的奇偶性用一个 \(v\) 位的二进制串 \(B\) 表示,\(B_i\) 为 \(0\) 说明 \(q_i\) 为偶数,\(B_i\) 为 \(1\) 说明 \(q_i\) 为奇数。比如 \(10 = 2^1 \times 3^0 \times 5^1\),可以用二进制串 \(101\) 来表示。

如果有两个数 \(x\) 和 \(y\),满足 \(x > y\),它们的二进制串 \(B\) 相同,那么 \(x \div y\) 一定是完全平方数。记 \(t_i\) 为每个 \(a_i\) 的前缀积,\(b_i\) 为每个 \(a_i\) 的前缀积所对应的二进制串。对于每个 \(i\) 如果存在 \(k_i\) 个 \(x\) 满足 \(i > x\),并且 \(b_i = b_x\),那么就有 \(k_i\) 个以 \(i\) 为右端点的区间积为完全平方数。最终答案 \(ans = \sum_{i = 1}^{n} \ k_i\)

代码实现

可以先把每个到 \(i\) 的前缀积对应的 \(b_i\) 用字符串表示,再用 map 存储(想省时间其实也可以用 unordered_map)对于每个 \(i\),满足条件的 \(x\) 的个数,即在 \(i\) 前面的二进制串等于 \(b_i\) 的数的个数。前缀积太大,不用高精度可能存不下,只需要存前缀积中每个质因子的指数就好了。

完整代码

#include<bits/stdc++.h>
using namespace std;

long long n, x, ans, cnt[11];
long long p[11] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; //30以内的所有质数(0是用来占位的)。 
map<string, long long>t;//存储当前每个二进制串出现了几次。 
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> x; 
		if(x != 1) {
			for (int i = 1; i <= 10; i++) //分解质因数。 
				while(x % p[i] == 0) {
					x /= p[i];
					cnt[i]++; //对应质因子的指数加一。 
				}
		}
		string str = "";
		for (int i = 1; i <= 10; i++)
			if(cnt[i] % 2) str += "1"; //奇数用1表示。 
			else str += "0" ; //偶数用0表示。 
		ans += t[str];
		if(str == "0000000000") ans++;//完全平方数需要特判 
		t[str]++;
	}
	cout << ans << endl;
    return 0;
}

标签:前缀,二进制,题解,long,times,int,GESP202406,P10724,每个
From: https://www.cnblogs.com/chrispang/p/18370996

相关文章

  • [题解]P3311 [SDOI2014] 数数
    P3311[SDOI2014]数数看到多模式匹配,我们考虑先对所有模式串建立AC自动机。然后发现这道题和P4052文本生成器(题解)挺像的,后者让求包含至少一个模式串的个数,这道题让求一个也不包含的个数,这个就是一个用不用\(26^m\)去减的问题,很好处理。但这道题还多了一个条件,“幸运数”必须\(......
  • Prometheus部署以及问题解决
    Prometheus作用:Prometheus监控(PrometheusMonitoring)是一种开源的系统监控和警报工具。它最初由SoundCloud开发并于2012年发布,并在2016年加入了云原生计算基金会(CNCF)。Prometheus监控旨在收集、存储和查询各种指标数据,以帮助用户监视其应用程序和系统的性能和运行状态。部署流......
  • 题解:CF454B Little Pony and Sort by Shift
    题目描述题目传送门给定一个长度为$n$的数组$a$,每次可以将最后一个元素移动到第一个,问:至少需要几次操作,让序列从小到大排好序,若无解输出$-1$。算法1(暴力枚举)不难想到,将最后一个元素拼接在第一个元素之前,就可以实现将链转换成环,再依次遍历在数组$a_i$中长度为$n$的......
  • Postman中Body添加注释后请求报错问题解决【保姆级教程!!!】
    本文介绍关于Postman中Body添加注释后请求报错问题解决方法如:请求返回下述报错操作失败!系统异常,JsonParseException:Unexpectedcharacter(‘/’(code47)):maybea(non-standard)comment?(notrecognizedasonesinceFeature‘ALLOW_COMMENTS’notenabled......
  • P2261 [CQOI2007] 余数求和 题解
    题目传送门思路数学数学非常经典的题目注意到\(k\bmodi=k-\lfloork/i\rfloor*i\)。于是可以对题目进行转化,从求\(G(n,k)=\sum_{i=1}^kn\bmodi\)变为求\(G(n,k)=n\timesk-\sum_{i=1}^n\lfloork/i\rfloor\timesi\),所以仅需求出\(\sum_{i......
  • 题解:AT_jag2016secretspring_b 豪邸と宅配便
    思路设\(T\)为总时间。由于第一次太郎一定会花\(m\)时间到达门口,所以\(t\)要先减去\(m\)。之后太郎就有两种选择在门口等待下一个快递,时间花费为\(a_i-a_{i-1}\)。回书房,学习一会,再拿快递,时间花费为\(2\timesm\)。则最优时间花费为\(\min(2\timesm,a_i-a_{i-1}......
  • 题解:CF362A Two Semiknights Meet
    题意有两个走法为中国象棋象的棋子,棋盘上有一些坏格子,问它们是否可以在好格子相遇。思路则判断两个棋子是否相遇有两个条件是否可以在一个格子相遇。那个格子是否是好格子。先考虑条件\(1\)设第一个棋子的坐标为\(a_x\)和\(a_y\),第二个棋子的坐标为\(b_x\)和\(b_y......
  • NOI2003 逃学的小孩 题解
    NOI2003逃学的小孩题解传送门。题目简述给定一棵树\(T\),需要选择三个点\(A,B,C\),需要从\(C\)走到\(A,B\)​​的最远距离。(第一段题目是在讲剧情吗。。)前置知识图树树的直径思路简述这题在蓝题(提高+/省选-)中还是比较水的^_^来看看样例吧用瞪眼法(——数学......
  • 题解:CF991D Bishwock
    思路考虑贪心。从左往右扫,找到一个就标记一个即可。但是要注意,当遇见这种情况时000000最优的方法是左右各放一个积木,共放入两块。但如果按照刚刚的方法,则有可能会是这样0X0XX0所以在一些地方有多种放法时,应该优先放置开口朝右的积木。ACCode#include<bits/stdc++.h>......
  • 题解:AT_abc365_c [ABC365C] Transportation Expenses
    题意已知\[\sum_{i=1}^{n}\min(x,a_i)\lem\]问\(x\)最大为多少。思路由于答案具有单调性,所以考虑二分答案。但是有一点要注意,当\(\sum_{i=1}^{n}a_i\lem\)时,应该输出infinite。因为此时的\(x\)可以为任意一个数。ACcode#include<bits/stdc++.h>#defineintun......