首页 > 其他分享 >P10724 [GESP202406 七级] 区间乘积,洛谷id:sxshm

P10724 [GESP202406 七级] 区间乘积,洛谷id:sxshm

时间:2024-10-21 21:16:31浏览次数:3  
标签:sxshm cnt 洛谷 前缀 int GESP202406 sum 状压 sumk

题解

一、分析

看看标签:数论,再看题目:完全平方。这不是质因数分解的标配吗?继续看数据范围: 1 ≤ a i ≤ 30 1\leq a_i\leq 30 1≤ai​≤30。直接枚举走起!!!

二、思路

1.数据处理

我们可以先把每一个数质因数分解,然后记录每一个质因子出现的次数(而不是有没有出现),然后把每一个质因子出现的次数的奇偶性记录下来,做一个前缀和(因为要连乘),状压(我这个蒟蒻竟然用了状压)成一个数,存下来。

2.计算答案

2.1 问题

现在每个前缀和的质因子出现个数都变成了 0 / 1 0/1 0/1,所以只要判断两个前缀和的状压状态相同即可,可是难道我们要把所有数对都遍历一遍吗?显然不行,复杂度 O ( n 2 ) O(n^2) O(n2) 直接爆炸。那怎么办呢?

2.2 解决

明显我们计算下标 i i i 的时候,需要比较的是前面有几个状压状态和 i i i 相等的,有没有更快的方式呢?当然有!我用的是 STL 中的 map,用来记录前面每个状态出现的次数。这样代码就呼之欲出了。

三、代码

#include<bits/stdc++.h>
using namespace std;
int prime[12]={0,2,3,5,7,11,13,17,19,23,29};//枚举质数
int n;
struct num{
	int cnt[12]={0,0,0,0,0,0,0,0,0,0,0,0};//初始化
}a[100010],sumk[100010];
int sum[100010];
map<int,int>mp;//存状态出现的次数
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		int t=1;
		while(x && t<=10){//分解质因子
			if(x%prime[t]==0){
				x/=prime[t];
				a[i].cnt[t]++;
			}else t++;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=10;j++){//做一个前缀和
			sumk[i].cnt[j]+=sumk[i-1].cnt[j]+a[i].cnt[j];
			sumk[i].cnt[j]%=2;//记录奇偶性
		}
		for(int j=1;j<=10;j++){
			sum[i]|=(1<<(j-1))*sumk[i].cnt[j];//状压
		}
	}
	int cnt=0;
	mp[0]=1;//注意有可能有些本身就是完全平方数
	for(int i=1;i<=n;i++){
		if(mp[sum[i]]!=0){
			cnt+=mp[sum[i]];//记录答案
		}
		mp[sum[i]]++;//记录状态
	}
	printf("%d",cnt);
	return 0;
}

END、最后

上面的代码并不能 AC,只有 80 分。是哪里错了呢?送你几句真言:

十年OI一场空,不开 LONGLONG 见祖宗

十年OI两茫茫,不开 LONGLONG 就凉凉
顺便宣传一下洛谷主页

拜拜

标签:sxshm,cnt,洛谷,前缀,int,GESP202406,sum,状压,sumk
From: https://blog.csdn.net/mbjx2021/article/details/143133777

相关文章

  • 洛谷 P1197 [JSOI2008] 星球大战 做题记录
    我不会做摧毁,于是反着做,就变成了合并连通块,倒序加边即可,时间复杂度\(O((n+m)\alpha(n))\)。(大抵是吧点击查看代码#include<bits/stdc++.h>#definemem(aqwqawa,bqwqawa)memset((aqwqawa),(bqwqawa),sizeof(aqwqawa))#definem0(aqwqawa)memset((aqwqawa),0,sizeof(aqwqaw......
  • 洛谷题单指南-字符串-P4735 最大异或和
    原题链接:https://www.luogu.com.cn/problem/P4735题意解读:已知长度为n的数组a[],要在l~r范围找到一个p,使得a[p]^a[p+1]^...^a[n]^x最大,求这个最大的异或值。解题思路:1、利用前缀和将问题转化设s[]是a[]的前缀异或数组,要计算a中一段范围l~r的异或,可以借助于s由于s[r]=a[0]^a[......
  • 【洛谷 P1116】车厢重组 题解(模拟+冒泡排序)
    车厢重组题目描述在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他......
  • 【洛谷 P1116】车厢重组 题解(模拟+冒泡排序)
    车厢重组题目描述在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他......
  • 洛谷P3741 小果的键盘(Python)
    海阔凭鱼跃,天高任鸟飞。——宋·阮阅《诗话总龟前集》一、题目传送门https://www.luogu.com.cn/problem/P3741二、代码input()s=list(input().strip())ans="".join(s).count("VK")foriinrange(len(s)):ifs[i]=='V':s[i]='K'......
  • 洛谷P5731 【深基5.习6】蛇形方阵(Python)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言尝试一种没写过的解法。一、题目传送门https://www.luogu.com.cn/problem/P5731二、代码deffuc(i,j,cur,sign):#位置为(i,j),写下cur,方向为signglobaln,ansifcur>n*n:retur......
  • 洛谷知识点——C++ 11 实现一次性输出多行文本
    完整语法是R"deli(...)deli"。(其中deli并不是固定的,那里其实是一个用户自定义的字符序列,最多16个基本字符,不可含反斜线,空格和小括号。)故P1000超级玛丽游戏解法为#include<iostream>usingnamespacestd;intmain(){cout<<R"(********......
  • 洛谷 P3382 三分
    三分题目背景本题可能存在严重精度问题,部分数据下难以通过。本题数据较水,仅供参考。题目描述如题,给出一个NNN次函数,保证在范围......
  • 20241018每日一题洛谷P2386
    普及每日一题信息学竞赛1206:放苹果把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1是同一种分法。第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。对输入的每组数据M和N,用一行输出相......
  • 【LGR-203-Div.4】洛谷入门赛 #28
    【LGR-203-Div.4】洛谷入门赛#28\(A\)luoguB4042[语言月赛202410]顺序结构\(AC\)顺序结构。点击查看代码intmain(){lla;cin>>a;cout<<3*(5+a)<<""<<3*a+5<<endl;return0;}\(B\)luoguB4043[语言月赛202410......