首页 > 其他分享 >CF1822G2 - Magic Triples

CF1822G2 - Magic Triples

时间:2023-04-25 20:25:11浏览次数:46  
标签:sz le Magic int void qry Triples hd CF1822G2

比较好的题目,别的不说,G1 对 G2 有着不错的启发性。

首先,因为 \(b>0,a_k\le 10^9\),所以 \(b\) 不可能超过 \(\sqrt{a}\)

考虑对 \(b\) 分类讨论,设置一个阈值 \(B\),先处理 \(b=1\) 的情况,其实就是取三个相同的数然后排列,可以比较简单的排序之后做到 \(O(n)\)。

接着手写一个哈希表用来存所有 \(a_i\) 出现次数。

然后考虑 \(1\lt b\le B\),这种情况下我们可以遍历枚举 \(i\),然后在哈希表中查询 \(ba_i\) 和 \(b^2a_i\) 出现的次数乘起来,注意不要乘上 \(a_i\) 出现的次数,因为每个 \(a_i\) 都会贡献一次。

然后分析 \(b\gt B\) 的情况,我们发现这时候因为 \(a_k\le 10^9\),所以 \(a_j\le 10^9/B\),那么我们就先枚举 \(a_j\),然后对于满足条件的 \(a_j\) 枚举因子作为 \(b\),一共有大约 \(\sqrt{10^9/B}\) 个。对于其所有大于 \(b\) 的因子,都尝试将其作为 \(b\),找到 \(a_i/b\) 和 \(ba_i\) 的出现次数乘起来即可。

记 \(B\) 为对 \(b\) 分治的长度,复杂度为 \(O(nB+n\sqrt{\dfrac{a_{max}}{B}})\)

此时取 \(B=a_{max}^{1/3}=1000\) 最优,足以通过此题。

const int N=200005,A=1000000000,B=1000;
ll n,a[200005];
struct hash_table{
	#define S 19198100
	vector<int>used;
	int sz=0,hd[S+5],id[N],nxt[N],w[N];
	inline void ins(int k){
		int u=k%S;
		for(int i=hd[u];i;i=nxt[i])if(id[i]==k)return (void)(w[i]++);
		++sz,nxt[sz]=hd[u],w[sz]=1,id[sz]=k,hd[u]=sz;
		used.push_back(u);
	}
	inline int qry(int k){
		for (int i=hd[k%S];i;i=nxt[i])if(id[i]==k)return w[i];
		return 0;
	}
	inline void flush(){
		sz=0;
		for(int i:used)hd[i]=0;
		used.clear();
	}
}h;
inline void solve(){
	cin>>n;
	rp(i,n)cin>>a[i];
	h.flush();
	rp(i,n)h.ins(a[i]);
	ll ans=0;
	map<ll,ll>mp;
	rp(i,n)mp[a[i]]++;
	for(auto i:mp)ans+=i.second*(i.second-1)*(i.second-2);
	rep(i,2,B){
		rp(j,n)if(a[j]*i*i<=A){
			ans+=h.qry(a[j]*i)*h.qry(a[j]*i*i);
		} 
	}
	rep(i,1,n)if(a[i]<=A/B){
		for(ll j=1;j*j<=a[i];j++)if(a[i]%j==0){
			if(a[i]*j<=A&&j>B)ans+=h.qry(a[i]/j)*h.qry(a[i]*j);
			if(a[i]*(a[i]/j)<=A&&a[i]/j>B)ans+=h.qry(j)*h.qry(a[i]*(a[i]/j));
		}
	}cout<<ans<<endl;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;
	cin>>t;
	rd(_,t)solve();
	return 0;
}
//Crayan_r

标签:sz,le,Magic,int,void,qry,Triples,hd,CF1822G2
From: https://www.cnblogs.com/jucason-xu/p/17353705.html

相关文章

  • nginx-lua-fastdfs-GraphicsMagick整合
      无意发现了一个不错的分布式文件系统。fastdfs开源的分布式文件系统,此脚本利用nginxlua模块,动态生成图片缩略图,fastdfs只存一份原图。lua通过socket获取fastdfs的原图,并存放到本地,根据不同规则url,例如:_60x60.jpg、_80x80.jpg,类似淘宝图片url规则。利用gm命令生成本地缩略图......
  • php imagick实现文字渐变
     参考文档: https://fengkui.net/articles/117 //实现css background:linear-gradient(-66deg,rgba(222,162,79,0.9)0%,rgba(255,236,161,0.94)39.74609375%,#DEA24F100%);publicfunctiondrawPrice($priceText){//创建新的画布对象和透......
  • Java Magic start
    1.JavaMagic.Part1:java.net.URLhttp://mishadoff.com/blog/java-magic-part-1-java-dot-net-dot-url/ 2.JavaMagic.Part2:0xCAFEBABEhttp://mishadoff.com/blog/java-magic-part-2-0xcafebabe/ 3.JavaMagic.Part3:Finallyhttp://mishadoff.com/blog/java-magic-p......
  • Java Magic. Part 4: sun.misc.Unsafe(译)
    JavaMagic.Part4:sun.misc.UnsafeJavaisasafeprogramminglanguageandpreventsprogrammerfromdoingalotofstupidmistakes,mostofwhichbasedonmemorymanagement.But,thereisawaytodosuchmistakesintentionally,usingUnsafeclass.Java是一种......
  • Clouds remind me that magical things in life can come out of nowhere
    Cloudscanalsotransportmeawayfromthedullerpartsoflife,awayfromboringsituationsandawayfromdaytodaystressesandworries.Theygetmeoutofmyheadandintoadreamscape,amagicallookinglandscapethatfloatsabovemewhereIcanimag......
  • magicos7.1和7.0的区别
    荣耀MagicOS7.1操作系统是在荣耀MagicOS7.0操作系统的基础上做的升级,MagicOS7.1操作系统相比较MagicOS7.0操作系统到底有了哪些升级也是大家比较关注的问题。magicos7.1和7.0的区别介绍 1、MagicOS7.1操作系统将MagicOS7.0操作系统的荣耀备忘录升级为了荣耀笔记,可以快速......
  • Magic Line (牛客多校) (贪心,构造)
    题目大意:在平面直角坐标系中有偶数个点,求两个点使这两个点的连线两边点的数量相同且不经过任何一个点点的坐标都为整数,且绝对值不大于1000思路:我们先对点按横坐标排序,找到中间的两个点,如果这两个点横坐标不同,可以在两点之间找一条平行于y轴的直线如果相同的,因为点的纵坐标不......
  • Magical GCD UVA - 1642
     对序列A, 求(j-i+1)*gcd(i,i+1,...j)最大值 G(i)=gcd(G[i-1],a[i]) 即前缀值不升维护1~j-1可能的i 值(logn个) O(n*log^2#include<iostream>#include<map>#include<cmath>#include<algorithm>usingnamespacestd;constintN=......
  • 荣耀magicbook安装Linux系统boot fail问题解决
    偶然网上冲浪,发现了Debian系的kalilinux有点意思,刚好手边有一台不怎么用的荣耀magicbook,于是准备装个双系统好不容易下完了kali的镜像,使rufus写入了U盘但是在安装过程中怎么安装都显示bootfail,切换了n个版本的Linux系统,发现还是这样,但是实测Debian11是可以进入引导项的最后所......
  • 第二十届浙大城市学院程序设计竞赛 I.Magic Tree DFS序线段树
    传送门大致思路:  我们知道dfs序上的整颗子树dfs序编号连续,因为每次删除一个点或者新增一个点都导致子树上所有点的深度加一或者减一。由于是区间修改所以我们考虑dfs序上建线段树。  #include<iostream>#include<cstring>#include<iomanip>#include<algorithm>#in......