本文主要是介绍UVa 10892 LCM Cardinality (数论+组合数学),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
UVa 10892 LCM Cardinality
题目大意:
输入正整数 n (
题目分析:
(想了好一会儿,orz……)
若将数拆分成唯一分解式,可以发现
设 a=pk11∗pk22∗...∗pknnb=pk′11∗pk′22∗...∗pk′nn
则有 gcd(a,b)=pmin(k1,k′1)1∗pmin(k2,k′2)2∗...∗pmin(kn,k′n)nlcm(a,b)=pmax(k1,k′1)1∗pmax(k2,k′2)2∗...∗pmax(kn,k′n)n
那么显然,对于 a 和
所以
当 ka=kn 时, 0≤kb<kn ,共计 kn
当 kb=kn 时, 0≤ka<kn ,共计 kn则总共为 kn∗2+1 ( +1 的原因是还有 ka=kb=kn )
当然最后的答案为ans/2+1(只取 a≤b 情况)
代码:
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>using namespace std;typedef long long ll;int main()
{int n;ll ans;while(scanf("%d",&n)==1&&n) {int m=sqrt(n),t=n;ans=1;for(int i=2;i<=m&&t!=1;i++) if(t%i==0) {int cnt=0;while(t%i==0) t/=i,++cnt;ans*=(cnt*2+1);//指数均为cnt的仅能计算一次 }if(t>1) ans*=3;printf("%d %lld\n",n,ans/2+1);//加上a=b=n的情况 }return 0;
}
这篇关于UVa 10892 LCM Cardinality (数论+组合数学)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!