蓝桥云课 数的拆分(数论)

2024-04-13 22:04
文章标签 蓝桥 数论 拆分 云课

本文主要是介绍蓝桥云课 数的拆分(数论),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

觉得这个题挺好的,留个档,至于题解在题目上已经有讲的很好的了。


思路:

数学思维题。

对一个数 x x x,根据唯一分解定理可以拆成 x = p 1 k 1 ∗ p 2 k 2 ∗ p 3 k 3 ∗ ⋯ ∗ p s k s x=p_1^{k_1}*p_2^{k_2}*p_3^{k_3}*\dots *p_s^{k_s} x=p1k1p2k2p3k3psks的形式,然后我们要把这个形式转化为题目上 x = q 1 y 1 ∗ q 2 y 2 x=q_1^{y_1}*q_2^{y_2} x=q1y1q2y2 的形式。

其实比较容易发现内部的 q 1 , q 2 q_1,q_2 q1,q2 还是可以再拆的,因此 y 1 , y 2 y_1,y_2 y1,y2 我们选择尽可能小的数会比较好凑。比如说 q 6 q^6 q6 ( q 3 ) 2 (q^3)^2 (q3)2 是完全相同的,但是后者的 y = 2 y=2 y=2 就比较好凑,指数为 2 2 2 的倍数的情况显然更加常见。因此我们选择让 y 1 = 2 , y 2 = 3 y_1=2,y_2=3 y1=2,y2=3

这样,对一个质因数 p i k i p_i^{k_i} piki,我们需要 q 1 y 1 ∗ q 2 y 2 = q 1 2 ∗ q 2 3 q_1^{y_1}*q_2^{y_2}=q_1^{2}*q_2^{3} q1y1q2y2=q12q23 包含它,假设 q 1 q_1 q1 x x x p i p_i pi q 2 q_2 q2 y y y p i p_i pi,那么就有 k i = 2 ∗ x + 3 ∗ y k_i=2*x+3*y ki=2x+3y。而这个式子在 k i > 1 k_i>1 ki>1 时是总是有解的(非负整数解)。换句话说,只要 k i > 1 k_i>1 ki>1 p i k i p_i^{k_i} piki 就有办法分到 q 1 q_1 q1 q 2 q_2 q2 中去,否则就没可能。因此我们只要保证所有质因数都满足它的指数大于 1 1 1,那么就存在一种分配方案,把 x x x 可以转化为 q 1 y 1 ∗ q 2 y 2 q_1^{y_1}*q_2^{y_2} q1y1q2y2 的形式。

不过要分解质因数,我们需要筛到 1 0 18 = 1 0 9 \sqrt{10^{18}}=10^9 1018 =109 以内的质因数,预处理就会超时。而且每个数我们都要分解一下,分解的时候需要枚举质因数,质因数的个数就不能太多。

考虑到当 x x x 转化为 q 1 y 1 ∗ q 2 y 2 = q 1 2 ∗ q 2 3 q_1^{y_1}*q_2^{y_2}=q_1^{2}*q_2^{3} q1y1q2y2=q12q23 的形式时,当 q 1 = 1 q_1=1 q1=1 q 2 = 1 q_2=1 q2=1 时,这个数就是个纯粹的平方数或者立方数,直接特判就行了。

q 1 , q 2 ≠ 1 q_1,q_2\not=1 q1,q2=1 时,这个数 x x x 就至少拥有了 5 5 5 个质因数。此时除了最大的质因数,其他较小的质因数一定都满足 ≤ 1 0 18 5 ≈ 3981 \le\sqrt[5]{10^{18}}\approx 3981 51018 3981,剩下的那个较大的质因数 q q q 只有可能是 q 1 , q 2 , q 3 , q 4 q^1,q^2,q^3,q^4 q1,q2,q3,q4(再多 它的大小就小于 1 0 18 5 \sqrt[5]{10^{18}} 51018 了),除开指数是 1 1 1 的情况,其他情况就是个平方数或者立方数,可以直接特判。

code:

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;ll prime[maxn],cnt;
bool vis[maxn];
void Eular(int n){vis[1]=true;for(int i=2;i<=n;i++){if(!vis[i])prime[++cnt]=i;for(int j=1,p=prime[1];j<=cnt && i*p<=n;p=prime[++j]){vis[i*p]=true;if(i%p==0)break;}}
}ll T,a;bool is2(ll x){ll l=1,r=x,mid;while(l<r){mid=l+r>>1;if(mid<=1e9 && mid*mid<x)l=mid+1;else r=mid;}return l*l==x;
}
bool is3(ll x){ll l=1,r=x,mid;while(l<r){mid=l+r>>1;if(mid<=1e6 && mid*mid*mid<x)l=mid+1;else r=mid;}return l*l*l==x;
}bool solve(ll a){if(is2(a) || is3(a)){return true;}for(int i=1,p=prime[1],c;i<=cnt && p<=a;p=prime[++i]){if(a%p==0){c=0;while(a%p==0){a/=p;c++;}if(c==1){return false;}}}if(is2(a) || is3(a))return true;else return false;
}int main(){Eular(5000);cin>>T;while(T--){cin>>a;puts((solve(a))?"yes":"no");}return 0;
} 

这篇关于蓝桥云课 数的拆分(数论)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901335

相关文章

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

POJ2247数论

p = 2^a*3^b*5^c*7^d 求形如上式的第n小的数。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.u

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

隐私计算实训营:SplitRec:当拆分学习遇上推荐系统

拆分学习的概念 拆分学习的核心思想是拆分网络结构。每一个参与方拥有模型结构的一部分,所有参与方的模型合在一起形成一个完整的模型。训练过程中,不同参与方只对本地模型进行正向或者反向传播计算,并将计算结果传递给下一个参与方。多个参与方通过联合模型进行训练直至最终收敛。 一个典型的拆分学习例子: Alice持有数据和基础模型。Bob只有数据、基础模型和fuse模型。 Alice使用自己的数据

2014年暑假培训 - 数论

A银河上的星星 /**************************************************************     Problem: 1014     User: DoubleQ     Language: C++     Result: Accepted     Time:190 ms     Memor

ZOJ1007(数论)

题目链接:点击打开链接 解题思路:   纯粹的数学题,没有输入,直接要求输出.直接给出的求和式子极限到无穷,无法直接计算.Hint里给出了提示,大意就是说求g(x) - g(1)的求和极限,最后再加上g(1)就能求出g(x).   由g(x)  - g(1) 能够得出 1 / k*(k+x) - 1 / k * (k + 1) = (1 - x) / k * ( k + 1) * (k

动态规划---单词拆分

题目: 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 思路:本题属于完全背包问题,字符串s的长度为背包容量,字符串列表wordDict中的每一个元素相当于物品。 动态规划五部曲: 1.确定dp数组及含义 dp数组为元素类型是布