[CodeForces - 1225D]Power Products 【数论】 【分解质因数】

标签:题解 codeforces题解 数论


题目描述

Time limit

2000 ms

Memory limit

524288 kB

Source

Technocup 2020 - Elimination Round 2

Tags

hashing math number theory *1900

Site

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

题面

Example

Input

6 3

1 3 9 8 24 1

Output

5

题目大意

给定\(n, k\),序列\(a[1 \cdots n]\)。问在该序列中能找到多少组序偶\(<i, j>\)满足\(a_i \cdot a_j = x ^ k\)(其中\(x\)可以为任意整数)。

例如,

\(n = 6, k = 3, a[1 \cdots n] = [1, 3, 9, 8, 24, 1]\)。

则有$$a_1 \cdot a_4 = 1 \cdot 8 = 8 = 2 ^ 3 \ a_1 \cdot a_6 = 1 \cdot 1 = 1 = 1 ^ 3 \ a_2 \cdot a_3 = 3 \cdot 9 = 27 = 3 ^ 3 \ a_3 \cdot a_5 = 9 \cdot 24 = 216 = 6 ^ 3 \ a_4 \cdot a_6 = 8 \cdot 1 = 8 = 2 ^ 3 $$

共五组情况,所以输出5。


解析

这道题是一道比较裸的数论题,很容易让人直接想到质因数分解。虽然我没有想到,当时打比赛都没有做到D题。

  • 这题首先不考虑数论的知识,把这种求序偶个数的问题抽象出来。

    把这道题抽象为给定\(n, k\),序列\(a[1 \cdots n]\)。问在该序列中能找到多少组序偶\(<i, j>\)满足\(a_i + a_j = k\)。

    这个问题其实很好解决,只要稍微想一下就可以得出答案。令\(cnt[i][j]\)为到第\(i\)个位置,数字\(j\)在之前出现的次数。那么答案应该是\(\sum_i^ncnt[i][k - a[i]]\)。

    在实际编程过程中,因为我们每到一个数\(a[i]\), \(cnt[i][a[i]]\)实际上是在上一个\(cnt[i - 1][a[i]]\)基础上得来的,而这个\(cnt[i - 1][a[i]]\)之后就再也没有用了,其他的\(cnt[i - 1][1 \cdots INF]\)也没有改变,所以我们可以将这个\(cnt\)数组降到一维,这个思想也叫作滚动数组。

  • 下面回到这个问题,把关键的\(a_i \cdot a_j = x ^ k\)加入其中。

    首先我们要知道当给定了\(k\),即使\(x\)的值是不确定的,对于\(t \cdot s = x ^ k\),对于每一个\(t\)都只有唯一的\(s\)与之对应。

    对\(t\)质因数分解,得

\[t = p_1^{\alpha_1} \cdot p_2^{\alpha_2} \cdot p_3^{\alpha_3} \cdot \dots \\ t_0 = p_1^{\alpha_1\% k} \cdot p_2^{\alpha_2\% k} \cdot p_3^{\alpha_3\% k} \cdot \dots
\]

则$$s = p_1^{k - (\alpha_1 % k)} \cdot p_2^{k - (\alpha_2 % k)} \cdot p_3^{k - (\alpha_3 % k)} \cdot \dots$$

所以对于每个\(t\)我们只要看之前有多少个这样的\(s\)出现就可以了。

而对于每个\(a_i(t)\)我们实际上要记录的是它的\(t_0\)形式,因为只有这种形式才对答案有贡献。

  • 这样我们在对每个\(a_i\)进行质因数分解的时候就顺带把\(s\)的值也求出来,最后\(\sum_i^ncnt[x ^ k \div a[i]]\)即为答案(\(cnt\)为滚动数组,即到当前\(i\)位置,之前的数字\(x ^ k \div a[i]\)出现的个数)。

通过代码

/*
Status
Accepted
Time
46ms
Memory
396kB
Length
1076
Lang
GNU G++11 5.1.0
Submitted
2019-12-20 16:42:32
RemoteRunId
67272043
*/ #include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int MAXN = 1e5 + 50; int cnt[MAXN];
int x, n, k;
ll y; //注意y要开long long. inline int read() //快读,1e5数据输入量.
{
int res = 0;
char ch; ch = getchar(); while(!isdigit(ch))
ch = getchar(); while(isdigit(ch)){
res = (res << 3) + (res << 1) + ch - 48;
ch = getchar();
} return res;
}
void work(int p, int &t)
{
int c = 0; while(t % p == 0)
t /= p, c ++;
c %= k; for(int i = 0; i < c; i ++)
x *= p; for(int i = 0; i < (k - c) % k; i ++){ //(k - c) % k是针对c为0的情况的特判.
y *= p; if(y >= MAXN){
y = MAXN;
break;
}
} return;
} int main()
{
ll ans = 0; n = read(), k = read(); for(int i = 1; i <= n; i ++){
int t;
t = read();
x = y = 1; //x对应的是t0,y对应的是s. for(int j = 2; j * j <= t; j ++) //质因数分解.
if(t % j == 0) work(j, t); if(t > 1) work(t, t); if(y < MAXN){ //如果得到的y超过1e5,就超过范围找不到了,就没有意义.
ans += cnt[y];
cnt[x] ++;
}
} printf("%I64d", ans);
return 0;
}

[CodeForces - 1225D]Power Products 【数论】 【分解质因数】的更多相关文章

  1. [Codeforces 1246B] Power Products (STL+分解质因数)

    [Codeforces 1246B] Power Products (STL+分解质因数) 题面 给出一个长度为\(n\)的序列\(a_i\)和常数k,求有多少个数对\((i,j)\)满足\(a_i ...

  2. Codeforces 1247D. Power Products

    传送门 要满足存在 $x$ ,使得 $a_i \cdot a_j = x^k$ 那么充分必要条件就是 $a_i \cdot a_j$ 质因数分解后每个质因数的次幂都要为 $k$ 的倍数 证明显然 设 ...

  3. 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 ...

  4. 数学概念——J - 数论,质因数分解

    J - 数论,质因数分解 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  5. Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论

    题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...

  6. Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】

    Aladdin and the Flying Carpet (LightOJ - 1341)[简单数论][算术基本定理][分解质因数](未完成) 标签:入门讲座题解 数论 题目描述 It's said ...

  7. 【分解质因数】【树状数组】【快速幂】codeforces 2014 ACM-ICPC Vietnam National Second Round E. ACM

    乘除都在150以内,分解质因数后发现只有35个,建立35个树状数组/线段树,做区间加.区间查询,最后快速幂起来. #include<cstdio> #include<cstring& ...

  8. Luogu P1069细胞分裂【分解质因数/数论】By cellur925

    题目传送门 发现这题真的坑超多啊...调了一晚上终于过了...我好菜啊qwq. 题意说的比较明白,让你求满足(si^k)%(m1^m2)==0的最小k值.然后看数据范围我们知道,我们肯定不能暴力的判断 ...

  9. Codeforces 1097D (DP+分解质因数)

    题目 传送门 分析 考虑\(n=p^q\)且p为质数的情况 设dp[i][j]表示经过i次变化后数为\(p^j\)的概率 则初始值dp[0][q]=1 状态转移方程为\(dp[i][j]=\sum{} ...

随机推荐

  1. matplotlib可视化最全指南

    1. 折线图:plt.plot 设置数据:plt.plot(x,y),单列数据传入默认y轴,此时x轴数据默认从0逐渐对应递增 设置颜色:plt.plot(x,y,color/c=" &quo ...

  2. Python之工作方向

    "python基础-->(函数/面向对象/网络编程(scoket套接字)/并发编程(mutiprocessing)) "运维+web开发-->页面展示(django/f ...

  3. Codeforces Global Round 6

    久违的写篇博客吧  A. Competitive Programmer 题目链接:https://codeforces.com/contest/1266/problem/A 题意: 给你一个只包含数字 ...

  4. Java 匿名类和lambda表达式

    一.匿名内部类 一个匿名内部类是一个没有名字的内部类.它将进一步定义一个内部类以及创建一个内部类的实例. 内部类处理器可以使用匿名内部类进行代码简化. 匿名内部类的语法如下所示: new SuperC ...

  5. C#中怎样获取默认配置文件App.config中配置的键值对内容

    场景 在新建一个程序后,项目中会有一个默认配置文件App.config 一般会将一些配置文件信息,比如连接数据库的字符串等信息存在此配置文件中. 怎样在代码中获取自己配置的键值对信息. 注: 博客主页 ...

  6. aspnet boilerplate 随笔二

    项目框架介绍: 1:Application: 在service里面事件具体业务,Dto相当于viewmodel实现了验证 2:Core:实现了数据层Model   3:EntityFrameworkC ...

  7. [20191213]toad 12下BIND_AWARE提示无效.txt

    [20191213]toad 12下BIND_AWARE提示无效.txt --//链接http://blog.itpub.net/267265/viewspace-2130781/的测试,发现当时测试 ...

  8. CMake工程找不到相应的cuDNN版本的问题

    (1) 去官网下载相应的版本,因为电脑之前安装的是 CUDA8. ,找跟 CUDA 版本兼容的 cuDNN 下载即可,我选择的是 cuDNN v7.(Deb) 和  cuDNN v7.1.4 Deve ...

  9. 分布式全局唯一ID的实现

    分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...

  10. 关于MFC与OpenGL结合绘图区域用鼠标来控制图形的移动的坑

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11773171.html 之前开发的导入多个模型,旋转,分别移动什么什么的,都是在纯OpenGL ...