题意是多少对 互不相同的下标i,j,k满足对应数等比

很自然的想到了枚举最大数,然后找到因子就做完了

1e9以内因子最多1e3,这个不难发现,知道怎么通过质因数分解得到因子个数就知道怎么算了。

毫无优化,全是暴力。居然过了

可以通过手写哈希去掉map的log,而且不难

我用了一个写的时候想到的哈希写法试了试,不过似乎常数很大?并没有优化多少

map写法

#include<bits/stdc++.h>
using namespace std;
const int P=998244353,N=4e4+10,inf=1e9+10;
using ll=long long;
bool st[N];
int pri[N],cnt;
void init()
{for(int i=2;i<N;++i){if(!st[i])pri[++cnt]=i;for(int j=1;pri[j]*i<N;++j){st[pri[j]*i]=1;if(i%pri[j]==0)break;}}
}
vector<array<int,2>>vec;
void func(int n)
{vec.clear();for(int i=1;i<=cnt;++i){if(n==1)return ;if(n%pri[i]==0){vec.push_back({pri[i],0});while(n%pri[i]==0)++vec.back()[1],n/=pri[i];}}if(n>1)vec.push_back({n,1});
}
vector<int>e;
void dfs(int now,int x)
{if(now==vec.size()){e.push_back(x);return ;}dfs(now+1,x);for(int i=1;i<=vec[now][1];++i){x=x*vec[now][0];dfs(now+1,x);}
}
ll C(int n)
{if(n<3)return 0;return 1ll*n*(n-1)*(n-2);
}
void solve()
{int n;scanf("%d",&n);vector<int>a(n);for(auto &v:a)scanf("%d",&v);map<int,int>mp;for(auto &v:a)mp[v]++;sort(a.begin(),a.end());a.erase(unique(a.begin(),a.end()),a.end());ll rs=0;for(auto &v:a){func(v);e.clear();dfs(0,1);//for(auto t:e)cout<<t<<" \n"[t==e.back()];for(auto &t:e){if(t==1)rs+=C(mp[v]);else{int x=v/t;if(x%t)continue;int y=x/t;rs+=1ll*mp[x]*mp[y]*mp[v];}}}printf("%lld\n",rs);
}
int main()
{init();int T=1;scanf("%d",&T);while(T--)solve();
}

取模哈希试了下

只从2500ms卡到了1900ms

#include<bits/stdc++.h>
using namespace std;
const int P=33331,N=33333+10,inf=1e9+10;
using ll=long long;
bool st[N];
int pri[N],cnt;
vector<array<int,2>>hsh[P+2];
void init()
{for(int i=2;i<N;++i){if(!st[i])pri[++cnt]=i;for(int j=1;pri[j]*i<N;++j){st[pri[j]*i]=1;if(i%pri[j]==0)break;}}
}
vector<array<int,2>>vec;
void func(int n)
{vec.clear();for(int i=1;i<=cnt;++i){if(n==1)return ;if(n%pri[i]==0){vec.push_back({pri[i],0});while(n%pri[i]==0)++vec.back()[1],n/=pri[i];}}if(n>1)vec.push_back({n,1});
}
vector<int>e;
void dfs(int now,int x)
{if(now==vec.size()){e.push_back(x);return ;}dfs(now+1,x);for(int i=1;i<=vec[now][1];++i){x=x*vec[now][0];dfs(now+1,x);}
}
ll C(int n)
{if(n<3)return 0;return 1ll*n*(n-1)*(n-2);
}
int find(int x)
{array<int,2>z={x,0};auto t=lower_bound(hsh[x%P].begin(),hsh[x%P].end(),z)-hsh[x%P].begin();if(t==hsh[x%P].size())return 0;if(hsh[x%P][t][0]==x)return hsh[x%P][t][1];return 0;
}
void solve()
{int n;scanf("%d",&n);vector<int>a(n);for(auto &v:a)scanf("%d",&v);map<int,int>mp;for(auto &v:a)mp[v]++;sort(a.begin(),a.end());a.erase(unique(a.begin(),a.end()),a.end());ll rs=0;for(auto v:a)hsh[v%P].push_back({v,mp[v]});set<int>S;for(auto v:a){if(S.find(v%P)!=S.end())continue;S.insert(v%P);sort(hsh[v%P].begin(),hsh[v%P].end());}for(auto &v:a){func(v);e.clear();dfs(0,1);//for(auto t:e)cout<<t<<" \n"[t==e.back()];for(auto &t:e){if(t==1)rs+=C(find(v));else{int x=v/t;if(x%t)continue;int y=x/t;rs+=1ll*find(x)*find(y)*find(v);}}}printf("%lld\n",rs);for(auto v:a)hsh[v%P].clear();
}
int main()
{init();//cout<<pri[cnt]<<endl;int T=1;scanf("%d",&T);while(T--)solve();
}

Codeforces Round 867 (Div. 3) G2. Magic Triples (Hard Version)相关推荐

  1. Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version)

    Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version) 题目链接 There are two binary strings a an ...

  2. Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树

    传送门 文章目录 题意: 思路: 题意: 比如下面这个图: 思路: 对于这个题,比较容易就能考虑到dpdpdp,设f[i][j]f[i][j]f[i][j]为到了第iii行,覆盖了[j,j+k−1][ ...

  3. Codeforces Round #617 (Div. 3) E2. String Coloring (hard version) 思维 + dp + Dilworth定理

    传送门 文章目录 题意: 思路: 题意: 让你给一个串染色,不同颜色且相邻的一对字符可以互换位置,用最少的颜色,使交换后这个字符串字典序最小. 思路: 考虑将字符串分成若干个非递减的子序列,由于其非递 ...

  4. Codeforces Round #368 (Div. 2) C. Pythagorean Triples

    题目链接:http://codeforces.com/contest/707/problem/C 题意: 直角三角形的三边都为整数,给出其中一边n,求另外两边m.k. (1 ≤ n ≤ 109)  ( ...

  5. Codeforces Round #143 (Div. 2)-D. Magic Box

    原题链接 D. Magic Box time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  6. Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)

    题目链接:http://codeforces.com/contest/1157/problem/C2 当左右两边数字相同时,需要判断一下取哪边能得到更长的递增序列 #include <iostr ...

  7. Codeforces Round #828 (Div. 3) E1. Divisible Numbers (easy version) 解题报告

    原题链接: Problem - E1 - Codeforces 题目描述: This is an easy version of the problem. The only difference be ...

  8. Codeforces Round #560 (Div. 3)F1.F2. Microtransactions (easy version)

    题目来源: F1:https://codeforces.com/contest/1165/problem/F1 F2:https://codeforces.com/contest/1165/probl ...

  9. 差分 ---- Codeforces Round #672 (Div. 2):C2. Pokémon Army (hard version)[差分的思想]

    题目链接 题目大意:就算给你一序列,按照顺序出若干个数组成一个的序列,然后对这个序列定义一个权值就算奇数位置的和减去偶数位置的和,问你能的到的最大的权值是多少? **a1 - a2 + a3 - a4 ...

最新文章

  1. UVA 10700 Camel trading
  2. Set Up Optimization
  3. PaddlePaddle训练营——公开课——AI核心技术掌握——第1章迈入现代人工智能的大门——多层感知机网络模型
  4. [leetcode]剑指offer32-1.从上到下打印二叉树
  5. 山东大学计算机非全上课,山东大学非全日制研究生上课方式
  6. 自己如何获取ADO连接字符串
  7. 计算平面坐标某点(x,y)与原点(0,0)的角度
  8. 基于MySQL和JavaFX的学生管理系统
  9. 百度地图ipa包使用的Framework解读
  10. 如何把PDF锁定,限制修改文档内容?
  11. 采用WPF开发第二版OFD阅读器,持续完善中,敬请期待
  12. android root测试,[原创]安卓逆向之绕过root检测的四种姿势
  13. 魔方心得-20180227
  14. Oracle中Minus的使用
  15. 查看windows产品密钥
  16. SumatraPDF添加保存标注到TXT文本的功能
  17. 注册Apple ID
  18. 2020 BNUZ 国庆欢乐赛 题解
  19. 计算用户的平均次日、三日和七日留存率
  20. 【modlearts】华为人工智能平台_modelarts平台系列教程3_预置算法_语音处理3

热门文章

  1. android设备识别不到5g无线网,手机搜索不到5gwifi信号_手机搜索不到5g网络怎么办?-192路由网...
  2. python簇状柱形图_python学习之路--可视化利器matplotlib(上)
  3. 成为CTO,6个月被老板干死,我损失了1000万
  4. PUBG Lite安装方法
  5. 微信小程序 base64 转化后台返回的 token
  6. 批量查询韵达快递单号物流信息的教学分享
  7. android studio 运行活动闪退Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'vo
  8. win7连接共享打印机报错:windows连接打印机失败0X0000011b
  9. WaaS助推企业数字化转型
  10. 鸿蒙应用项目分享:我的鸿蒙毕设:基于HarmonyOS的任务看板平台【四点一】:导入项目并运行!