题目链接

传送门

题面

题意

首先定义对于\(k\)的好数\(u\):如果\(u\leq k\)且\(u\)的所有质因子与\(k\)的质因子一样则称\(u\)对于\(k\)是一个好数。

现给你两个数\(k1,k2(1\leq k1,k2\leq 10^{24})\),要你求\(k1,k2\)的好数个数,对于\(k1,k2\)有两者的最大质因子一定相同第二大质因子一定不同。

思路

我们知道对于小于等于\(10^{24}\)的数最多有三个大于\(10^6\)的质因子,因此对于数\(k1,k2\)我们可以先将其小于等于\(10^6\)的质因子全部分离出来,那么最后最多还剩三个质因子的指数相乘。

我们设\(p1,p2,p3\)为二者的最一、二、三大质因子。

如果最后剩余的\(k1,k2\)只剩\(p1\),那么就只能是\(p1\)的幂次,此时可以通过枚举求出\(p1\)的指数,因为大于\(1e6\)的数最多\(3\)次就大于\(10^{24}\)了。

如果最后剩余的\(k1,k2\)剩\(p1,p2\)的幂次相乘,那么\(gcd(k1,k2)\)一定是\(p1\)的幂次,因为二者的\(p2\)一定不同嘛~这样我们可以通过两次枚举得到其指数。

如果最后剩余的\(k1,k2\)剩\(p1,p2,p3\)的幂次相乘,那么\(p1,p2,p3\)的指数一定都是\(1\)次。

因为好数的要求是需要质因子与\(k\)相同,所以每个质因子的次数至少为\(1\),所以如果\(k=p_1^{c_1}p_2^{c_2}\dots\),那么答案就是\(\prod\limits_{i=1}^{n}c_i\)。

代码实现如下

import java.util.*;
import java.math.*; public class Main {
static int cnt = 0;
static Boolean v[] = new Boolean[1000007];
static int p[] = new int[1000007]; public static void init() {
for(int i = 0; i <= 1000000; ++i) v[i] = false;
for(int i = 2; i <= 1000000; ++i) {
if(!v[i]) p[cnt++] = i;
for(int j = 0; j < cnt && i * p[j] <= 1000000; ++j) {
v[i*p[j]] = true;
if(i % p[j] == 0) break;
}
}
} public static int check(BigInteger k) {
if (k.equals(BigInteger.ONE)) return 1; BigInteger a = BigInteger.valueOf((long)Math.sqrt(k.doubleValue()));
if (k.equals(a.multiply(a))) return 2;
a = a.add(BigInteger.ONE);
if (k.equals(a.multiply(a))) return 2; BigInteger b = BigInteger.valueOf((long)Math.pow(k.doubleValue(), 1.0/3));
if (k.equals(b.multiply(b.multiply(b)))) return 3;
b = b.add(BigInteger.ONE);
if (k.equals(b.multiply(b.multiply(b)))) return 3; return 1;
} public static void main(String[] args) {
init();
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
BigInteger k[] = new BigInteger[5];
while(t-- != 0) {
for(int i = 0; i < 2; ++i) k[i] = sc.nextBigInteger();
long ans[] = new long[5];
for(int i = 0; i < 2; ++i) {
ans[i] = 1L;
for(int j = 0; j < cnt; ++j) {
if(k[i].mod(BigInteger.valueOf(p[j])) == BigInteger.ZERO) {
long num = 0;
while(k[i].mod(BigInteger.valueOf(p[j])) == BigInteger.ZERO) {
++num;
k[i] = k[i].divide(BigInteger.valueOf(p[j]));
}
ans[i] *= num;
}
}
}
k[2] = k[0].gcd(k[1]);
if(k[2].compareTo(BigInteger.valueOf(1000000)) > 0) {
int x = check(k[2]);
BigInteger g;
if(x == 1) g = k[2];
else if(x == 2) {
BigInteger tmp = BigInteger.valueOf((long)Math.sqrt(k[2].doubleValue()));
if(k[2].equals(tmp.multiply(tmp))) g = tmp;
else g = tmp.add(BigInteger.ONE);
} else {
BigInteger tmp = BigInteger.valueOf((long)Math.pow(k[2].doubleValue(), 1.0/3));
if(k[2].equals(tmp.multiply(tmp).multiply(tmp))) g = tmp;
else g = tmp.add(BigInteger.ONE);
} for(int i = 0; i < 2; ++i) {
long num = 0;
while(k[i].mod(g) == BigInteger.ZERO) {
++num;
k[i] = k[i].divide(g);
}
ans[i] *= num;
if(k[i].compareTo(BigInteger.valueOf(1000000)) > 0) {
ans[i] *= check(k[i]);
}
}
}
System.out.println(ans[0] + " " + ans[1]);
}
sc.close();
}
}

对象用\(=\)进行比较是否相等是看地址。

Good Numbers(HDU5447+唯一分解)的更多相关文章

  1. K. Random Numbers(Gym 101466K + 线段树 + dfs序 + 快速幂 + 唯一分解)

    题目链接:http://codeforces.com/gym/101466/problem/K 题目: 题意: 给你一棵有n个节点的树,根节点始终为0,有两种操作: 1.RAND:查询以u为根节点的子 ...

  2. HDU5447 Good Numbers

    http://acm.hdu.edu.cn/showproblem.php?pid=5447 网上好像只找到java的题解,写完就发一下c++代码咯,顺便纪念一下+存个int128板子 做法可以看tj ...

  3. SPOJ:Divisors of factorial (hard) (唯一分解&分块优化)

    Factorial numbers are getting big very soon, you'll have to compute the number of divisors of such h ...

  4. Min25 筛与 Powerful Numbers

    Min25 筛与 Powerful Numbers Min25 筛 大喊一声 Min25 NB!!! 这是一个非常神奇的东西,用于求更加普遍的积性函数的前缀和. 比如我们要求 \(\sum_{i=1} ...

  5. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  6. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  7. [LeetCode] Add Two Numbers II 两个数字相加之二

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  8. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  9. [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

随机推荐

  1. 前端传实体数组;后台list实体接收参数

    前端页面: $.ajax({ url: url, data: JSON.stringify(data), dataType: "json", contentType: " ...

  2. centos6 rpm安装mysql 5.7

    安装过程中需要进行系统补包操作 [root@cent6zbx ~]# rpm -qa |grep mysql mysql-libs--.el6_6.x86_64 [root@cent6zbx ~]# ...

  3. HTML5自定义select标签样式的方法

    HTML5自定义select标签样式的方法 -webkit-appearance: none; 这个东西可以隐藏箭头 不过手机端就直接 设置透明度为0就行了(如果这种做法比前面个要麻烦点 毕竟还要对他 ...

  4. Python实现字典树

    字典树,又称单词查找树,Trie 树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串 ...

  5. Delphi RSA签名与验签【支持SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA签名与验签】

    作者QQ:(648437169) 点击下载➨ RSA签名与验签 [delphi RSA签名与验签]支持3种方式签名与验签(SHA1WithRSA(RSA1).SHA256WithRSA(RSA2)和M ...

  6. Django框架之DRF APIView Serializer

    一.APIView 我们在使用DjangoRestfulFramework的时候会将每个视图类继承APIView,取代原生Django的View类 APIView的流程分析: rest_framewo ...

  7. t100 常用公用變數

    g_enterprise 目前的企業代碼,將限制使用者所能閱讀的資料內容g_prog 目前執行的作業編號,用於變換畫面顯示資料與產生系統資訊,不可變更g_code 目前執行的程式代碼(4gl)名稱,不 ...

  8. sublime配置python环境及快捷键

    sublime配置python环境 参考链接:https://blog.csdn.net/VertigozZ/article/details/54574006 快捷键的配置:https://www.c ...

  9. C ProcessAsUser

    class Interop { public static void CreateProcess(string app, string path) { bool result; IntPtr hTok ...

  10. flask与flask-script的使用

    flask与flask-script的使用 一.安装 pip install Flask-Script 二.简单的使用 # manage.py from flask_script import Man ...