Pairs Forming LCM LightOJ - 1236(整数唯一分解定理+筛选素数)

逆向实战:手把手教你用Frida绕过Flutter App的SSL Pinning(附脚本修改指南) 本文详细介绍了如何利用Frida工具绕过Flutter应用的SSL Pinning保护机制,包括静态分析定位关键函数、定制Frida Hook脚本以及流量捕获的完整解决方案。通过实战案例和脚本修改指南,帮助安全研究人员有效应对Flutter应用的安全挑战,特别适用于安卓平台的逆向工程和抓包需求。 阅读详情

Pairs Forming LCM

LightOJ - 1236

Find the result of the following code:

long long pairsFormLCM( int n ) {
   
 long long res = 0;
   
 for( int i = 1; i <= n; i++ )
       
 for( int j = i; j <= n; j++ )
           
if( lcm(i, j) == n ) res++; // lcm means least common multiple
   
 return res;
}

A straight forward implementation of the code may time out. If you analyze the code, you will find that the code actually counts the number of pairs (i, j) for which lcm(i, j) = n and (i ≤ j).


Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case starts with a line containing an integer n (1 ≤ n ≤ 1014).

Output

For each case, print the case number and the value returned by the function 'pairsFormLCM(n)'.

Sample Input

15

2

3

4

6

8

10

12

15

18

20

21

24

25

27

29

Sample Output

Case 1: 2

Case 2: 2

Case 3: 3

Case 4: 5

Case 5: 4

Case 6: 5

Case 7: 8

Case 8: 5

Case 9: 8

Case 10: 8

Case 11: 5

Case 12: 11

Case 13: 3

Case 14: 4

Case 15: 2

题意:给你一个n,让你找到n以内的LCM(i,j) = n的个数,其中i <= j


思路:这道题的精髓是运用了整数的唯一分解定理,求约数,倍数,质因数,gcd,lcm,都应该想到这个定理。

下面解释为什么:
我们假设( a , b ) = n ,那么:
我们把每个数都分解开看一下有什么规律
n = p1^a1 * p2^a2 * p3^a3 * …… * pk^ak;
a = p1^e1 * p2^e2 * p3^e3 * …… * pk^ek;
b = p1^d1 * p2^d2 * p3^d3 * …… * pk^dk;
我们发现首先如果要是a b两个数的最小公倍数等于n,对于每个素因子(p1p2…pk)
两个数ab中必须至少要有一个数是完整包含n中的对应的那个素因子的幂所得到的数的。
具体来说比如我们看p1这个素因子,ab中至少有个数包含p1^a1,也就是说e1 = a1或者d1 = a1或者两个都等于,也就是max(e1,d1) = a1.
那么推广到一般情况对于每个素因子 都存在 max(ei,di) = ai;

大家想一下这是为什么?
因为不是要求最小公倍数嘛,最终求法就是 a * b /gcd(a,b)
我们分解看 p1^e1 * …… pk^ek * p1^d1 * …… * pk^dk/ gcd(a,b)
所以我们发现分子中每个素因子会出现两次,一个属于a的一个属于b的,那么最大公因数gcd(a,b)不就是每个素因子的那个较小次幂的的乘积嘛,这样除去这些后,也就是分子中除去了这些幂次较小的后剩下幂次较大的素因子,如果想要最终结果等于n那么这些素因子的幂次必须一一对应n中每个素因子的幂次,这就是为什么ab中至少一个数字必须完整拥有对应素因子。

明白了上面的道理,就为我们找种类数提供的基础
我们每个素因子每个素因子的看
对于第i个素因子pi,ab两个数有多少种情况呢,肯定一个数是全部包含的,但是两个都有可能所以就是2,对于另一个数这个对应素因子的幂次的取值范围应该在[0,ai]
所以另一个数有ai+1种可能,对于这个素因子,看上去总的种类就应该是2*(ai+1)
但是别高兴太早,有一种情况就是两者都是完整包含,这时会多算一次,所以实际的对于每个素因子pi,  a,b两个数的取值可能就是2*(ai+1)-1 = 2*ai+1
那么总的可能就是所有乘起来:
(2*a1+1) * (2*a2+1) * (2*a3+1) * …… * (2*ak+1)
但是这个结果是无顺序情况下的,也就是(a,b)a<b和a>b算作两种
而题目要求a<=b,所以我们只取前一半
就直接除以2。      就可以了吗??
当然不行,别忘了其中的情况并不是所有都是2中,当两个数的素因子都完全包含n中的素因子时,是只有一种的所以除以2后需要再+1,把除没的那个一种情况再加回来
所以实际答案公式是
(2*a1+1) * (2*a2+1) * (2*a3+1) * …… * (2*ak+1) / 2 + 1

注意题目仍然有很多坑,直接判断求每个素因子的次数会超时,需要先筛选除素数存下来,n<=1e14,所以我们需要筛选1e7的素数,但是存素数的数组需要用1e6否则内存超限

code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 1e7+10;
const int N = 1e6;
bool isprime[maxn];
int prime[N];
int top;
void init(){
    memset(isprime,true,sizeof(isprime));
    isprime[0] = isprime[1] = false;
    top = 0;
    for(int i = 2; i < maxn; i++){
        if(isprime[i]){
            prime[top++] = i;
            for(int j = i+i; j < maxn; j += i){
                isprime[j] = false;
            }
        }
    }
}
int main(){
    init();
    int t,cas = 0;
    scanf("%d",&t);
    while(t--){
        ll n,ans = 1LL;
        scanf("%lld",&n);
        for(int i = 0; (ll)prime[i] * (ll)prime[i] <= n && i < top; i++){
            if(n % prime[i] == 0){
                int cnt = 0;
                while(n % prime[i] == 0){
                    cnt++;
                    n /= prime[i];
                }
                ans = ans * (ll)(2 * cnt + 1);
            }
            if(n == 1) break;
        }
        if(n != 1) ans = ans * 3;
        printf("Case %d: %d\n",++cas,ans/2+1);
    }
    return 0;
}




n=pk11pk22⋯pkss,a=pd11pd22⋯pdss, b=pe11pe22⋯pess,可以确定max(ei,di)=ki,那么ki的组成就是ei与di中一个等于ki,另一个任取[0,ki]中的一个数,那么就有2(ki+1)种方案,实际上由于ei=di=ki方案会出现重叠,所以第i位方案数为2(ki+1)−1=2ki+1,有序对(a,b)方案数就是(2k1+1)(2k2+1)⋯(2ks+1),无序对(a,b)方案数就是:[(2k1+1)(2k2+1)⋯(2ks+1)+1]/2(n,n)已经只有一个,不会重复,所以+1。
n=pk11pk22⋯pkss,a=pd11pd22⋯pdss, b=pe11pe22⋯pess,可以确定max(ei,di)=ki,那么ki的组成就是ei与di中一个等于ki,另一个任取[0,ki]中的一个数,那么就有2(ki+1)种方案,实际上由于ei=di=ki方案会出现重叠,所以第i位方案数为2(ki+1)−1=2ki+1,有序对(a,b)方案数就是(2k1+1)(2k2+1)⋯(2ks+1),无序对(a,b)方案数就是:[(2k1+1)(2k2+1)⋯(2ks+1)+1]/2(n,n)已经只有一个,不会重复,所以+1。
FPGA实现DDR接口 verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。 阅读详情

相关推荐

地平线RDKX3初始配置与USB无线网卡

地平线X3无线网卡配置

Richard_Mei的博客 4075

【唯一分解定理】Pairs Forming LCM

Find the result of the following code: longlongpairsFormLCM(intn){ longlongres=0; for(inti=1;i<=n;i++) for(intj=i;j<=n;j++) if( lcm(i,j) ...

SummerDream 257

CMakeTestCCompiler.cmake错误解决

CMakeTestCCompiler.cmake错误解决欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近编译项目的时候,遇到一个cmake的错误,具体错误信息如下: /path-to-pr

昨夜星辰的博客 2万+

唯一分解定理

什么是唯一分解定理? 算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。一个数n肯定能被分解成 n=p1^a1 * p2 ^a2 * p3 ^ a3…pn ^an;因为一个数必定是由合数和质数组成的,而合数又可以分解成合数和质数,如此递归下去,这个数必定可以用质数来表示。 比如:36=49=2233=2^2 * 3 ^2; 唯一分解定理的应用 1.求数n的因子个数:(1+a1)(1+a2)(1+a3)(1+a4)…(1+an)

数据结构实验之栈与队列十一:refresh的停车场 958

基于高精度三维机器视觉的新能源汽车锂电池表面缺陷检测

在机器视觉行业迅速发展的背景下,市场上提供了功能强大且种类齐全的3D相机系列,可以满足锂电池从电芯到模组各个工艺和工位的3D检测需求。

Hinyeung_Limited的博客 1131

海康威视工业相机SDK二次开发实战:多相机同步采集与图像存储

本文详细介绍了海康威视工业相机SDK二次开发实战,包括多相机同步采集与图像存储的优化方案。通过MVS软件搭建开发环境,实现硬件与软件触发同步采集,并提供高效的图像存储管理技巧,帮助开发者提升工业视觉项目的效率与稳定性。

weixin_29168813的博客 665

B - Pairs Forming LCM——(LightOJ 1236)

传送门Find the result of the following code:long long pairsFormLCM( int n ) { long long res = 0; for( int i = 1; i <= n; i++ ) for( int j = i; j <= n; j++ ) if( lcm(i, j) == n )

代码改变世界 743

PIDNet实战:如何在Cityscapes数据集上实现93.2 FPS的实时语义分割(附完整训练代码)

本文提供了在Cityscapes数据集上实现实时语义分割模型PIDNet的完整工程实践指南。PIDNet凭借其独特的比例-积分-微分三分支架构,在CVPR 2023上取得了速度与精度的出色平衡。文章详细介绍了从环境配置、数据预处理、模型训练到性能优化与部署的全流程,并分享了实现93.2 FPS高推理速度的关键技巧与代码。

weixin_29047919的博客 373

LightOJ1236 Pairs Forming LCM 素数筛法+分解质因数

Description Find the result of the following code: long long pairsFormLCM( int n ) {     long long res = 0;     for( int i = 1; i  n; i++ )         for( int j = i; j  n; j++ )

Megumin的博客 1147

基于Python的微信聊天记录分析——数据获取

本篇为“基于Python的微信聊天记录分析”第一篇,主要涉及数据获取,包括Python环境配置、WeChatMsg项目配置和运行、获取聊天记录等内容,流程简单、比较基础,后续这个系列会涉及基于Python的数据处理、统计分析、NLP技术等内容。希望和大家多多交流,共同进步!

Henryli1202的博客 1万+

电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程

本文详细介绍了如何使用STM32驱动AD9959信号发生器模块,从硬件接线到软件调试的全流程。AD9959作为高性能DDS芯片,适用于电子设计竞赛中的信号生成需求。文章包含硬件连接指南、寄存器配置解析、多通道控制技巧以及常见问题解决方案,帮助参赛者快速掌握AD9959的应用。

weixin_31858171的博客 366

LightOJ 1236 - Pairs Forming LCM (LCM·唯一分解)

题意  给你一个数n  求满足lcm(a, b) == n, a 容易知道 n 是a, b的所有素因子取在a, b中较大指数的积 先将n分解为素数指数积的形式  n = π(pi^ei)    那么对于每个素因子pi  pi在a,b中的指数ai, bi 至少有一个等于pi, 另一个小于等于pi 先不考虑a, b的大小  对于每个素因子pi 1. 在a中的指数 ai == ei   那么

Deng's site \# 2779

Codesys.运动控制修改凸轮点

通过改凸轮曲线的主从轴缩放比例或者偏置。 新建多个凸轮曲线,对CAM曲线进行切换。 程序中动态修改,仅修改中间的关键点(凸轮末点修改or凸轮曲线运行中修改)。 程序中动态修改,修改首未关键点及关键点个数,需要重新触发MC_TableSelect。 使用程序新建凸轮表代码,实现电子凸轮基本运动。 我们讲的凸轮表切换、关键点修改、程序新建电子凸轮,这些方法没有本质区别,总之都是“趁曲线不注意,把凸轮表改了。

傻响雨 6826

LightOJ 1236 Pairs Forming LCM (LCM 唯一分解定理 + 素数筛选)

http://lightoj.com/volume_showproblem.php?problem=1236 Pairs Forming LCM Time Limit:2000MSMemory Limit:32768KB64bit IO Format:%lld & %llu SubmitStatusPracticeLightOJ 123...

deyou1988的专栏 186

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LightOJ 1236 Pairs Forming LCM (唯一分解定理)

题意:求 (i, j) 的组数,使得 lcm(i, j) = n (i ≤ j)。 题解:唯一分解定理 对于因子公式 n = p1e1* p2e2*…*pmem ,要使得lcm(i, j) = n,那么a与b中,对于pi的指数,至少应有一个是等于ei的。那么对于一个因子,个数就是2 *ei + 1,遍历所有因子,乘起来即可。 注意i ≤ j,那么除了(n, n)之外其他组都出现两次。 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #inc

gongyuandaye的博客 218

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LightOJ 1236 Pairs Forming LCM (唯一分解定理)

Pairs Forming LCM Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Description Find the result of the following code: long long pairsFormLCM( 

哇咔咔 316

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

H - Pairs Forming LCM Light1236

算数基本定理是个很基本的东西,他可以推导出很多东西; http://acm.hust.edu.cn/vjudge/contest/79396#problem/H 把n分解成pi^ei然后算个数; 注意n比最大筛选的素数还要大点,所以要特判一次; 还有要判重复数的个数; 我好菜呀,我好菜呀,我好菜呀; ac代码 #include #include #include using

yawen的博客 499

LightOj 1236 Pairs Forming LCM (素数筛选&&唯一分解定理)

题目大意:   有一个数n,满足lcm(i,j)==n并且i<=j时,(i,j)有多少种情况? 解题思路:   n可以表示为:n=p1^x1*p2^x1.....pk^xk。   假设lcm(a,b) == n;   a = p1^c1 * p2^c2 ..... pk^ck。   b = p1^e1 * p2^e2 .... pk^ek。   xi = max(ci, ei)...

weixin_30546933的博客 138

LightOJ1236 - Pairs Forming LCM 唯一分解定理应用

1236 - Pairs Forming LCM   PDF (English)StatisticsForumTime Limit: 2 second(s)Memory Limit: 32 MBFind the result of the following code:long long pairsFormLCM( int n ) {    long long res = 0;    for( i...

Uniontake 225

LightOJ - 1236 Pairs Forming LCM

Find the result of the following code: long long pairsFormLCM( int n ) {     long long res = 0;     for( int i = 1; i &lt;= n; i++ )         for( int j = i; j &lt;= n; j++ )            if( lcm(i, j)...

hpu风之旅 208

lightOJ 1236 Pairs Forming LCM(算术基本定理)

lightOJ 1236 Pairs Forming LCM 大意:求解N内的lcm(i,j)=N的对数(i,j)。 (a,b)和(b,a)算一对 分析: 做此题时,注意存储素因子的数组长度设置问题。我用1e7的int数组不断MLE,换成vector才解决了内存问题。(用C写,居然判我bool型错误,我不知所云。一共交了差不多20遍。) #include #include

theArcticOcean 765

LightOJ - 1236质因子分解+LCM

Find the result of the following code: long long pairsFormLCM( int n ) {     long long res = 0;     for( int i = 1; i  n; i++ )         for( int j = i; j  n; j++ )            if( lcm(i, j) ==

baidu_35522092的博客 485

Pairs Forming LCM 唯一分解定理

题目: Find the result of the following code: A straight forward implementation of the code may time out. If you analyze the code, you will find that the code actually counts the number of pairs (i, ...

zhangjinlei321的博客 247

Pairs Forming LCM LightOJ - 1236 (算术定理)

Find the result of the following code:long long pairsFormLCM( int n ) { long long res = 0; for( int i = 1; i <= n; i++ ) for( int j = i; j <= n; j++ ) if( lcm(i, j) == n

Hanylch 341

Pairs Forming LCM (数论)质因数分解+素数筛。

题目:https://vjudge.net/contest/242286#problem/D Find the result of the following code: long long pairsFormLCM( int n ) {     long long res = 0;     for( int i = 1; i &lt;= n; i++ )         for( int j...

偷吃了老鼠的土豆 260

Pairs Forming LCM LightOJ - 1236————(算术基本定理+容斥)

Find the result of the following code: long long pairsFormLCM( int n ) { long long res = 0; for( int i = 1; i &lt;= n; i++ ) for( int j = i; j &lt;= n; j++ ) if( lcm(i, j...

鸿杰 的博客 444
上一篇: Harmonic Number (II) LightOJ - 1245 (找规律+数学)
下一篇: Harmonic Number LightOJ - 1234(打表+技巧||调和级数逼近公式)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值