LightOJ 1236 - Pairs Forming LCM(素因子分解)
Posted Ritchie丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ 1236 - Pairs Forming LCM(素因子分解)相关的知识,希望对你有一定的参考价值。
题意 给你一个数n 求满足lcm(a, b) == n, a <= b 的 (a,b) 的个数
容易知道 n 是a, b的所有素因子取在a, b中较大指数的积
先将n分解为素数指数积的形式 n = π(pi^ei) 那么对于每个素因子pi pi在a,b中的指数ai, bi 至少有一个等于pi, 另一个小于等于pi
先不考虑a, b的大小 对于每个素因子pi
1. 在a中的指数 ai == ei 那么 pi 在 b 中的指数可取 [0, ei] 中的所有数 有 ei + 1 种情况
2. 在a中的指数 ai < ei 即 ai 在 [0, ei) 中 那么 pi 在 b 中的指数只能取 ei 有 ei 种情况
那么对与每个素因子都有 2*ei + 1种情况 也就是满足条件的 (a, b) 有π(2*ei + 1)个 考虑大小时除了 (n, n) 所有的情况都出现了两次 那么满足a<=b的有(π(2*ei + 1)) / 2 + 1个
#include <iostream> #include <stdio.h> typedef long long LL; using namespace std;; const int N=1e7+5; int p[N/10],k,i,j; bool flag[N];//默认是false void sushu() { k=0; for(i=2;i<N;i++) { if(!flag[i]) { p[k++]=i; for(j=i;j<N;j=j+i) //j=i 不是j=2 flag[j]=true; } } } int main() { sushu(); int t,cas=0; LL n,ans,c; cin>>t; while(t--) { cin>>n; ans=1; for(i=0;i<k;i++) { if(LL(p[i])*p[i]>n) break; c=0; while(n%p[i]==0) { n/=p[i]; c++; } if(c) ans*=2*c+1; } if(n>1) ans*=3; printf("Case %d: %lld\n",++cas,ans/2+1); //大写的C } return 0; }
以上是关于LightOJ 1236 - Pairs Forming LCM(素因子分解)的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ 1236 Pairs Forming LCM(算数基本定理)
1236 - Pairs Forming LCM -- LightOj1236 (LCM) 给你一个数n,让你求1到n之间的数(a,b && a<=b)两个数的最小公倍数等