[Codeforces 1246B] Power Products (STL+分解质因数)
[Codeforces 1246B] Power Products (STL+分解质因数)
题面
给出一个长度为\(n\)的序列\(a_i\)和常数k,求有多少个数对\((i,j)\)满足\(a_i \times a_j = x^k (x \in \mathbb{N}^+)\)。即这两个数乘起来恰好为一个正整数的\(k\)次方
\(a_i,n \leq 10^5\)
分析
考虑\(x^k\)的质因数分解式 , 那么每一项的指数一定是k的倍数,即 \(k|x_i\).
因此对于每个 \(a_i\), 把它的质因数分解结果\(\sum p_i^{x_i}\)记录在一个数组中,每个元素形如\((p_i, x_i \ \mathrm{mod}\ k )\)
那么 \(a_j\)的质因数分解为 $\sum p_i^{k-x_i \ \mathrm{mod} k } $.
所以只要求有多少个数组满足每一项都是$ (p_i,k-x_i \mathrm{mod}\ k) $.用 map< vector< pair<int,int> >, int> cnt;
存储就可以了
每个数组的大小为 \(O(\log n)\) ,总时间复杂度为 \(O(n \log ^2 n)\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#define maxv 100000
#define maxn 100000
using namespace std;
typedef long long ll;
int n,k;
map< vector< pair<int,int> >, int> cnt;
vector< pair<int,int> >p1,p2;
int a[maxn+5];
int vis[maxv+5];
int minprime[maxv+5];
int prime[maxv+5];
void sieve(int n) {
vis[1]=1;
for(int i=2; i<=n; i++) {
if(!vis[i]) {
minprime[i]=i;
prime[++k]=i;
}
for(ll j=1; j<=k&&(ll)i*prime[j]<=n; j++) {
minprime[(ll)i*prime[j]]=prime[j];
vis[(ll)i*prime[j]]=1;
if(!(i%prime[j])) break;
}
}
}
void divide(int x) {
if(!vis[x]) {
p1.push_back(make_pair(x,1));
p2.push_back(make_pair(x,k-1));
return;
}
while(x>1) {
int t=minprime[x],u=0;;
while(x%t==0&&x!=1) {
x/=t;
u=(u+1)%k;
}
if(u!=0){
p1.push_back(make_pair(t,u));
p2.push_back(make_pair(t,k-u));
}
}
}
void print(vector< pair<int,int> > &x){
for(int i=0;i<x.size();i++){
printf("(%d,%d) ",x[i].first,x[i].second);
}
printf("\n");
}
int main(){
sieve(100000);
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
ll ans=0;
for(int i=1;i<=n;i++){
p1.clear();
p2.clear();
divide(a[i]);
// print(p1);
// print(p2);
ans+=cnt[p2];
cnt[p1]++;
}
printf("%I64d\n",ans);
}
[Codeforces 1246B] Power Products (STL+分解质因数)的更多相关文章
- [CodeForces - 1225D]Power Products 【数论】 【分解质因数】
[CodeForces - 1225D]Power Products [数论] [分解质因数] 标签:题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory ...
- Codeforces 1247D. Power Products
传送门 要满足存在 $x$ ,使得 $a_i \cdot a_j = x^k$ 那么充分必要条件就是 $a_i \cdot a_j$ 质因数分解后每个质因数的次幂都要为 $k$ 的倍数 证明显然 设 ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) D. Power Products 数学 暴力
D. Power Products You are given n positive integers a1,-,an, and an integer k≥2. Count the number of ...
- Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...
- 【分解质因数】【树状数组】【快速幂】codeforces 2014 ACM-ICPC Vietnam National Second Round E. ACM
乘除都在150以内,分解质因数后发现只有35个,建立35个树状数组/线段树,做区间加.区间查询,最后快速幂起来. #include<cstdio> #include<cstring& ...
- Codeforces 1097D (DP+分解质因数)
题目 传送门 分析 考虑\(n=p^q\)且p为质数的情况 设dp[i][j]表示经过i次变化后数为\(p^j\)的概率 则初始值dp[0][q]=1 状态转移方程为\(dp[i][j]=\sum{} ...
- Gym 101981J - Prime Game - [数学题][线性筛+分解质因数][2018-2019 ACM-ICPC Asia Nanjing Regional Contest Problem J]
题目链接:http://codeforces.com/gym/101981/attachments 题意: 令 $mul(l,r) = \prod_{i=l}^{r}a_i$,且 $fac(l,r)$ ...
- poj 1730Perfect Pth Powers(分解质因数)
id=1730">Perfect Pth Powers Time Li ...
- java分解质因数
package test; import java.util.Scanner; public class Test19 { /** * 分析:对n进行分解质因数,应先找到一个最小的质数k * 最小 ...
随机推荐
- 016:URL命名与反转URL
为什么需要URL命名? 主要解决蛋疼url变化情况,比如:哪天项目经理或领导过来说,把login改成signin,把register改成signup等蛋疼的需求——因为一旦改了url后,相关视图函数里 ...
- HTML5测试(二)
HTML5测试(四) 1.input 元素中,下列哪个类型属性定义了输入电话号码的控件? A.mob B.tel C.mobile D.telephone 答案:B 具有 type 属性的 input ...
- ef 分页
public List<TEntity> FindList(Expression<Func<TEntity, bool>> predicate, Paginatio ...
- create-react-app+react-app-rewired引入antd实践
注:模块化按此方发npm install antd --save npm install babel-plugin-import --save-dev npm install react-app-re ...
- gdal test
https://blog.csdn.net/hb_programmer/article/details/81807699 gdal/ogr是一个光栅和矢量地理空间数据格式的翻译库,由开源地理空间基金会 ...
- [CSP-S模拟测试]:取石子(博弈论+DP)
题目描述 有三堆石子,它们的石子个数分别为$x,y,z$.$A$和$B$正在博弈,由$A$先手,双方轮流操作.每次操作是指,选择若干堆($1-3$堆)石子,从中各取出相同数量的石子(不能$1$个都不取 ...
- Integer类源码浅析
1.首先Integer提供了两类工具类,包括把一个int类型转成二进等, 其实执行转换算法只有一个方法: public static String toString(int i, int radix) ...
- 第一次试验报告&学习总结
打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个"水仙花数". 试验代码: p ...
- leetcode-mid-math - 69. Sqrt(x)-NO
mycode memory error class Solution(object): def mySqrt(self, x): """ :type x: int : ...
- ORACLE sqlprompt设置
SYS@orcl>defineDEFINE _DATE = "17-JUN-19" (CHAR)DEFINE _CONNECT_IDENTIFIER = ...