热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

D.PowerProducts

https:codeforces.comproblemsetproblem1225D题目描述Youaregivennnpositiveintegersa_1,\ldots,a_

https://codeforces.com/problemset/problem/1225/D

题目描述

You are given nn positive integers a_1, \ldots, a_na1​,…,an​ , and an integer k \geq 2k≥2 . Count the number of pairs i, ji,j such that 1 \leq i

输入格式

The first line contains two integers nn and kk ( 2 \leq n \leq 10^52≤n≤105 , 2 \leq k \leq 1002≤k≤100 ).

The second line contains nn integers a_1, \ldots, a_na1​,…,an​ ( 1 \leq a_i \leq 10^51≤ai​≤105 ).

输出格式

Print a single integer — the number of suitable pairs.

题意翻译

现在给你nn个正整数 [a_1,a_2,...,a_n][a1​,a2​,...,an​] 和一个的正整数k\geq2k≥2,现在请你求出有多少组 (i,j)(i,j) ,满足 (1≤i

输入格式

输入第一行是两个正整数nn和kk(2≤n≤10^5,2≤k≤100)(2≤n≤105,2≤k≤100)

第二行为nn个正整数[a_1,a_2,...,a^n](1≤a_i≤10^5)[a1​,a2​,...,an](1≤ai​≤105)

输出格式

输出一个整数,表示有多少满足条件的组合

样例说明

样例中有以下几组满足条件的组合

a_1*a_4=8=2^3a1​∗a4​=8=23

a_1*a_6=1=1^3a1​∗a6​=1=13

a_2*a_3=27=3^3a2​∗a3​=27=33

a_3*a_5=216=6^3a3​∗a5​=216=63

a_4*a_6=8=2^3a4​∗a6​=8=23

一共五组,所以输出为55

输入输出样例

输入 #1复制

6 3
1 3 9 8 24 1

输出 #1复制

5

说明/提示

In the sample case, the suitable pairs are:

  • a_1 \cdot a_4 = 8 = 2^3a1​⋅a4​=8=23 ;
  • a_1 \cdot a_6 = 1 = 1^3a1​⋅a6​=1=13 ;
  • a_2 \cdot a_3 = 27 = 3^3a2​⋅a3​=27=33 ;
  • a_3 \cdot a_5 = 216 = 6^3a3​⋅a5​=216=63 ;

 

 

 


暴力的思路沿呈https://blog.csdn.net/zstuyyyyccccbbbb/article/details/108357803

式子转化一下可以得到

但是k==2的时候,预处理的数字个数有1e5个,然后去处理就超时了。(TLE6)

这题有一个结论:两个数的积为 k 次方数,当且仅当每一质因子的次数和都是 k 的倍数。

证明:把两个数分别个分解质因数了。

A=p1^k1*p2^k2*p3^k3....pn^kn;

B=p1^c1*p2^c2*p3^c3.....pn^cn;

对于每个质因数pi,ki+ci为k的整数倍的时候,i与j成功配对

因为i*j=p1^(k1+c1)*p2^(k2+c2)*.....pt^(kt+ct)

此时i*j必为X^k.

那么只有k==2TLE,我们特判k==2的时候。k==2的时候,也就是i*j的每个质因数pi的次数(ki+ci)为2的整数倍。也就是只有在ki和ci同时为奇数或者偶数的时候才成立。

那先预处理1e5以内的质因子,然后对每个a[i]质因数分解,用bitset维护每个a[i]每个质因数出现的次数。然后把bitset存到unordered_map里,查询的时候查里面同奇偶的map[bitset]

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define debug(a) cout<<#a<<"&#61;"<using namespace std;
const int maxn&#61;1e5&#43;100;
typedef long long LL;
const int cntp&#61;1e4;//质数个数
LL n,k1,a[maxn];
LL v[maxn],primes[maxn];//v[i]存的是i的最小质因子,primes[m]里面存筛出来的质数
mapmap1;
unordered_map,LL>mp;
LL x[maxn];
LL m&#61;0;//质数个数
inline LL ksm(LL x,LL a){LL ret&#61;1,k&#61;x;for (;a;a>>&#61;1,k&#61;k*k)if (a&1) ret&#61;ret*k;return ret;
}
void getprimes(int n)
{//memset(v,0,sizeof(v));//最小质因子 for(LL i&#61;2;i<&#61;n;i&#43;&#43;){if(v[i]&#61;&#61;0) {v[i]&#61;i;primes[&#43;&#43;m]&#61;i;}//i是质数 //给当前的数i乘上一个质因子for(LL j&#61;1;j<&#61;m;j&#43;&#43;){//i有比primes[j]更小的质因子&#xff0c;或者超出n的范围&#xff0c;停止循环 if(primes[j]>v[i]||primes[j]>n/i) break;//primes[j]是合数i*primes[j]的最小质因子 v[i*primes[j]]&#61;primes[j];} }//for(LL i&#61;1;i<&#61;m;i&#43;&#43;) cout<}
int main(void)
{cin.tie(0);std::ios::sync_with_stdio(false);cin>>n>>k1;for(LL i&#61;1;i<&#61;n;i&#43;&#43;) cin>>a[i];sort(a&#43;1,a&#43;1&#43;n);if(k1&#61;&#61;2){LL ans&#61;0;getprimes(100000);bitsetb;for(LL i&#61;1;i<&#61;n;i&#43;&#43;){b.reset();//全置0b.set(0);//第0位置赋1LL tmp&#61;a[i];LL cnt&#61;0;for(LL j&#61;1;j<&#61;m;j&#43;&#43;){while(tmp%primes[j]&#61;&#61;0){&#43;&#43;cnt;tmp/&#61;primes[j];}if(cnt&1) b.set(j);cnt&#61;0;if(tmp&#61;&#61;1) break;} ans&#43;&#61;mp[b];mp[b]&#43;&#43;;}cout<&#61;1e10) {pos&#61;i;break; }}LL ans&#61;0;//枚举右端 for(LL i&#61;1;i<&#61;n;i&#43;&#43;){ans&#43;&#61;map1[a[i]];for(LL j&#61;1;j<&#61;pos;j&#43;&#43;){if((x[j])%a[i]&#61;&#61;0){map1[x[j]/a[i]]&#43;&#43;; }}}cout<return 0;
}

 


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
本来就是哦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有