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

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

时间:2024-07-16 09:19:06浏览次数:18  
标签:prime int 题解 long 二进制位 异或 GESP202406 P10724

思路

看到 \(a_i\) 很小,不难想到状压一类的东西。考虑把每个数的质因数当做二进制位,这个二进制位的 \(1/0\) 代表含有这个质因数的奇偶,再做一个异或前缀和,显然完全平方数的质因子个数一定为偶数,根据异或的性质,两个相同的数异或才为 \(0\) 所以只需要找到异或前缀和中相同的数的个数就行了。

时间复杂度 \(O(n\sqrt n + n)\)

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;

int n,ans;

int a[N],prime[N],cnt,vis[N],dis[N],s[N];

void init(int M) {
	for(int i=2;i<=M;++i) {
		if(!vis[i]) prime[++cnt] = i;
		for(int j=1;j<=cnt;++j) {
			if(prime[j]*i>N) break;
			vis[prime[j]*i] = 1;
			if(i%prime[j]==0) break;
		}
	}
	for(int i=1;i<=cnt;++i) dis[i] = pow(2,i-1);
	return ;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0) , cout.tie(0);
	cin>>n;
	init(31);
	for(int i=1;i<=n;++i) {
		cin>>a[i];
		for(int j=1;j<=cnt;++j) {
			int t = 0;
			while(a[i]%prime[j]==0) {
				a[i] /= prime[j];
				t++;
			}
			t%=2;
			s[i]+=t*dis[j];
		}
//		ans+=(sqrt(a[i])*sqrt(a[i])==a[i]);
		s[i]^=s[i-1];
		if(!s[i]) ans++;
	}
	sort(s+1,s+1+n);
	int res = 0;
	for(int i=1;i<=n;++i)
		if(s[i]==s[i+1]) res++;
		else ans += max(res*(res+1)/2,0LL),res = 0;
	cout<<ans<<"\n";
	return 0;
}

标签:prime,int,题解,long,二进制位,异或,GESP202406,P10724
From: https://www.cnblogs.com/DuckYa/p/18304493

相关文章

  • 迷宫守卫 题解
    给个题目链接:迷宫守卫。下面直接开始讲了。发现一个事情,省选的题已经不怎么考板子难度很高的题了,现在考的都是思维难度非常高的题。首先,我们考虑字典序的性质,如果第一位劣,那么后面无论多优都没用,所以我们要优先满足靠前的位置。于是我们考虑使用二分来找出第一个数,后面以此类......
  • 题解:SP11469 SUBSET - Balanced Cow Subsets
    SP11469(折半搜索)题目大意:给出$N$个数,求可以被分成两个和相等的集合的子集数。思路分析:首先考虑朴素的DFS,每个数有三种情况:选为$A$集合,选为$B$集合,两个集合都不选。暴力DFS时间复杂度为$3^{20}$。观察到$N$很小,而$3^{10}$是可以通过本题的,于是考虑折半搜索。我......
  • P10720 [GESP202406 五级] 小杨的幸运数字 题解
    题意如果一个数的质因子中只有两个不同的数则输出\(1\),否则输出\(0\)。思路从第一个质因子遍历到\(sum\)的话很明显是\(O(nt)\)最大是\(n^{10}\)很明显会炸掉。所以遍历到\(sum\)是不行的,考虑正整数\(n\)最大的质因数是\(\sqrt{n}\)所以遍历到\(\sqrt{n}\)即......
  • 题解:SP10502 VIDEO - Video game combos
    大意构造一个长度为\(k\)(\(k\)是给定的)的串\(x\),使得对于\(∀1\leqi\leqn,s_i\)在\(x\)中的出现次数之和最大。输出这个最大值。思考考虑对\(s_i\)建AC自动机,然后dp。记\(dp[i][u]\)表示为长度为\(i\)的字符串,且当前已计算的节点是Trie上的编号为\(u......
  • 【题解】 [CSP-J 2021 T1] 分糖果
    题目描述题目大意给定正整数\(n\)、\(L\)、\(R\),求\(\max_{i\in\left[L,R\right]}{i\bmodn}\)。思路题目主要考察:分类讨论。众所周知,对于\(\forallx\),有$(x\bmodn)\in\left[0,n-1\right]$。可以分为两种情况讨论:如果\(\left\lfloor\frac{L......
  • 题解:CF1833F Ira and Flamenco
    思路因为要一个长度为\(m\)的,且最大与最小的元素之差小于等于\(m\)所以序列应为\(a_i,a_i+1,a_i+2\dots,a_i+m-1\),所以满足要求的序列之需要连续\(m\)个就行了,这个最开始排序,去重后用lower_bound求一下小于\(a_i+m-1\)的数有没有\(m\)个就行了。考虑满足要求序列的......
  • P8704 [蓝桥杯 2020 省 A1] 填空问题 题解
    题目传送门A.跑步训练我们经过仔细观察,可以发现每222分钟就会消耗300300......
  • P2754 [CTSC1999] 家园 / 星际转移问题题解
    开始时,将源点连一条权值为\(k\)的边到地球。然后以时间分层,从上一层的点连接到下一层的点,权值为飞船载人数量,并将代表月球的点连接到汇点。每加一层,在上一层的基础上进行增广,看能不能增加流量,如果流量变为\(k\),那么证明运送完成。可以证明枚举时间最多到\(1500\),图的点数不......
  • SP4063 MPIGS - Sell Pigs / P4638 [SHOI2011] 银行家题解
    考虑使用网络流。建立源点\(S\)和汇点\(T\)。每个人作为一个点,将它们与汇点\(T\)连接,权值为需要的猪的数量。然后对于每个人,如果和之前的某个人开了相同的猪圈,那么就将之前的那个人的点与这个人的点连接。如果猪圈还没有被开过,就从源点\(S\)连接这个点,权值为猪圈猪的初......
  • P1402 酒店之王题解
    考虑使用网络流。分为\(6\)层。第一层为源点。第二层为所有菜的点。第三层和第四层都表示人。(限制只能选择一个)。第五层为房子。第六层为汇点。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=410,M=101000,INF=0x3f3f3f3......