CF1822G2 - Magic Triples
比较好的题目,别的不说,G1 对 G2 有着不错的启发性。
首先,因为
考虑对
接着手写一个哈希表用来存所有
然后考虑
然后分析
记
此时取
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
这个做法看上去比较优美,但你仔细一想它还是有那么一丝神头鬼脸。毕竟如果不出这个 G1,就很难把
那么就平心而论,续写这个还不完美的句号。
我们发现,最大数其实就是
考虑为什么我们可以根号枚举因子,因为两数相乘为
每出来一个数之后,我们先尝试拿它做
接着尝试拿他做
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;
sort(a+1,a+1+n);
vt<pll>v;
rp(i,n){
if(!v.size()||v.back().first!=a[i])v.pb({a[i],1});
else v.back().second++;
}
for(auto ix:v){
ll f=ix.first,c=ix.second;
ans+=c*(c-1)*(c-2);
for(ll b=1;b*b*b<=f;b++)if(f%b==0){
if(b>1&&f%(b*b)==0){
if(f/(b*b)<b)continue;
ans+=c*h.qry(f/b)*h.qry(f/(b*b));
}
ll k=(ll)sqrt(f/b);
if(b<k&&b*k*k==f){
ans+=c*h.qry(b*k)*h.qry(b);
}
}
}cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
rd(_,t)solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】