CF1992F Valuable Cards

题意分析

长度为n的序列ai,求将序列划分为最少数列的区间,这些区间的要求是区间内任意选出任意数的乘积不等于x。

求解思路

要让区间数列尽可能少,就得尽可能的多向右扩展,能加入当前区间就加,加不了再开新区间。

问题转为:新加入一个数y,这个区间的任意数的乘积是否会变成x。

对于y而言,y*sum=x,sum是要判断的区间内任意数的乘积,我们发现

  1. 只有y是x的约数,才能在乘以另一个数的时候变成x。也就是说,y如果不是x的约数,那么直接放进当前区间即可,不需要再作其他操作。
  2. 当y是x的约数时,就要看这个区间内是否有可能构成x的乘积存在了,这里如何判断呢?感觉是一个难点。

解决:把所有的约数记录下来,来一个ai,就与这一段区间内的数相乘,如果结果是x的约数,就把它记录下来,方便后面用,如果相乘的结果不是x的约数,那么直接不用管。

代码实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[100009],ans;
unordered_set<int>s,cur;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		s.clear();cur.clear();
		int n,x;
		ans=1;
		cin>>n>>x;
		for(int i=1;i<=n;i++)  cin>>a[i];
		
		for(int i=1;i<=n;i++)
		{
			if(x%a[i]!=0)  continue;
			for(auto j:s)//计算当前段中所有数*a[i] 
			{
				int k=a[i]*j;
				if(x%k==0)
				{
					if(k==x)
					{
						ans++;
						s.clear();
						cur.clear();
						break;
					}
					cur.insert(k);
				}
			}
			for(auto j:cur)
			{
				s.insert(j);	
			}
			cur.clear();
			if(x%a[i]==0)  s.insert(a[i]);			
		}
		cout<<ans<<endl;
	}
 } 

样例过了,但没有在cf测,突然上不了cf了,后面再测把,先发出来。

相关推荐
05Kevin3 小时前
lk每日冒险题--数据结构6.27
算法
To_OC13 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安18 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者21 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy1 天前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC2 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635072 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法