HDU 6623"Minimal Power of Prime"(数学)

传送门

•题意

  给你一个大于 1 的正整数 n;

  它可以分解成不同的质因子的幂的乘积的形式,问这些质因子的幂中,最小的幂是多少。

•题解

  定义 $ans$ 表示最终答案;

  ①如果 $ans \ge 5$:

    那么,肯定有 $n=p^{ans}\ ,\ p \le \sqrt[{ans}]{n}$,也就是说 $\ p \le 10^{\frac{18}{5}}$;

  所以,我们可以提前预处理出 $[1,10000]$ 的素数表

•Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define mem(a,b) memset(a,b,sizeof(a))
 5 const int N=1e4;
 6
 7 ll n;
 8 int cnt;
 9 int prime[N];
10 bool isPrime[N+50];
11
12 void Prime()
13 {
14     cnt=0;
15     mem(isPrime,true);
16     isPrime[1]=false;
17
18     for(int i=2;i <= N;++i)
19     {
20         if(isPrime[i])
21             prime[++cnt]=i;
22
23         int x;
24         for(int j=1;j <= cnt && (x=i*prime[j]) <= N;++j)
25         {
26             isPrime[x]=false;
27
28             if(i%prime[j] == 0)
29                 break;
30         }
31     }
32 }
33 bool Calc(ll x)
34 {
35     int l=1,r=(int)1e6+1;
36     while(r-l > 1)
37     {
38         ll mid=l+((r-l)>>1);
39         if(mid*mid*mid > x)
40             r=mid;
41         else
42             l=mid;
43
44         if(mid*mid*mid == x)
45             return true;
46     }
47     return false;
48 }
49 int Solve()
50 {
51     int ans=100;
52     for(int i=1;i <= cnt;++i)
53     {
54         int k=0;
55         while(n%prime[i] == 0)
56         {
57             k++;
58             n /= prime[i];
59         }
60         if(k)
61             ans=min(ans,k);
62
63         if(n == 1 || ans == 1)
64             return ans;
65     }
66
67     ll x=sqrt(sqrt(n));
68     ll y=sqrt(n);
69
70     if(x*x*x*x == n)
71         ans=min(ans,4);
72     else if(y*y == n)
73         ans=min(ans,2);
74     else if(Calc(n))
75         ans=min(ans,3);
76     else
77         ans=1;
78
79     return ans;
80 }
81 int main()
82 {
83     Prime();
84
85     int T;
86     scanf("%d",&T);
87     while(T--)
88     {
89         scanf("%lld",&n);
90         printf("%d\n",Solve());
91     }
92     return 0;
93 }

原文地址:https://www.cnblogs.com/violet-acmer/p/11708166.html

时间: 2024-10-08 21:05:47

HDU 6623"Minimal Power of Prime"(数学)的相关文章

HDU 6623 Minimal Power of Prime(思维)题解

题意: 已知任意大于\(1\)的整数\(a = p_1^{q_1}p_2^{q_2} \cdots p_k^{q_k}\),现给出\(a \in [2,1e18]\),求\(min\{q_i\},q \in [1, k]\).即求质因数分解后,最小指数是多少. 思路: 因为\(a \in [2,1e18]\),所以我们现打一个\(1e4\)以内的质数表,然后直接求出\(1e4\)以内的情况. 上面弄完了,那么现在最多只有\(4\)个质因子,情况如下: \(n = p^4\),这种情况就是\(4\

Minimal Power of Prime

题目链接 题意:输入n,求所有质因子幂的最小值.n奇大无比. 思路:先对n所有n开五次方根的质因子约完,然后如果没有除尽的话,因子最多也就4个了,所以幂数大于1的情况有p1^4,p1^3, p1^2  对于其他情况肯定有幂为1的. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define ll long lon

HDU 4896 Minimal Spanning Tree(矩阵快速幂)

题意: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一个循环,接下来的9个点连回去的边都是一样的.预处理出5个点的所有连通状态,总共只有52种,然后对于新增加一个点和前面点的连边状态可以处理出所有状态的转移.然后转移矩阵可以处理出来了,快速幂一下就可以了,对于普通的矩阵乘法是sigma( a(i, k) * b(k, j) ) (1<=k<=N), 现在

hdu 5621 KK&#39;s Point(数学,推理题)

题解: 在圆上点三个点时,除圆上三个交点外,圆内没有交点:在圆上点四个点时,除圆上四个交点外,圆内出现了一个交点,因此,在N个点中每四个点便可以在圆内产生一个交点,因此N个点在圆内形成的点的个数为CN4,总的交点数就是CN4+N 1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cstrin

hdu 5344 MZL&#39;s xor(数学之异或)

Problem Description MZL loves xor very much.Now he gets an array A.The length of A is n.He wants to know the xor of all (Ai+Aj)(1≤i,j≤n) The xor of an array B is defined as B1 xor B2...xor Bn Input Multiple test cases, the first line contains an inte

HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】

难度上,,,确实,,,不算难 问题是有个矩阵运算的优化 题目是说给个N*K的矩阵A给个K*N的矩阵B(1<=N<=1000 && 1=<K<=6),先把他们乘起来乘为C矩阵,然后算C^(N*N) 相当于 ABABABABABABAB...=(AB)^(N*N) 不如 A(BA)^(N*N-1)B 因为BA乘得K*K的矩阵,K是比较小的 #include <cstdio> #include <cstdlib> #include <cstr

hdu 2489 Minimal Ratio Tree(dfs枚举 + 最小生成树)~~~

题目: 链接:点击打开链接 题意: 输入n个点,要求选m个点满足连接m个点的m-1条边权值和sum与点的权值和ans使得sum/ans最小,并输出所选的m个点,如果有多种情况就选第一个点最小的,如果第一个点也相同就选第二个点最小的........ 思路: 求一个图中的一颗子树,使得Sum(edge weight)/Sum(point weight)最小~ 数据量小,暴力枚举~~~~~dfs暴力枚举C(M,N)种情况. 枚举出这M个点之后,Sum(point weight)固定,进行prim或者K

hdu 4803 Poor Warehouse Keeper(贪心+数学)

题目链接:hdu 4803 Poor Warehouse Keeper 题目大意:有以个屏幕可以显示两个值,一个是数量x,一个是总价y.有两种操作,一种是加一次总价,变成x,x+y:一种是加一个数量,这要的话总价也会相应加上一个的价钱,变成x+1,y+y/x.总价显示的为取整后的整数,小数部分忽略.给定一个目标x,y,初始状态为1,1,求最少需要多少次可以目标状态,不可以达到的话输出-1. 解题思路:如果是加一次总价的话,单价就在变大:如果是加一次数量的话,单价是不变的.总而言之,单价是只会往上

hdu 6034 Balala Power!

题目链接:hdu 6034 Balala Power! 题意: 给你n个字符串,都是包含小写字母,现在让你给a~z赋值0~25,使得这些字符串变成的26进制的数的总和最大. 不能有前导0的情况,他们保证至少有一个字母不出现在第一位. 题解: 每个字符对答案的贡献都可以看作一个 26 进制的数字,问题相当于要给这些贡献加一个 0 到 25 的权重使得答案最大.最大的数匹配 25,次大的数匹配 24,依次类推.排序后这样依次贪心即可,唯一注意的是不能出现前导 0. 前导0的具体处理看代码. 1 #i