链接:https://vjudge.net/problem/UVA-10892
Time limit3000 msOSLinux
题意:输入正整数n(n≤2∗109),统计有多少对正整数a≤b,满足lcm(a,b)=n.输出n和形成的对数.
分析:n的因子不是很多,可以把所有因子求出来,暴力求解
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <sstream>
#include <vector>
#include <string>
#include <set>
#include <map>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define pb(x) push_back(x)
typedef long long LL;
const int mod=1e6;
const double eps=1e-6;
const int INF=0x3f3f3f3f;
const int N=205;
vector<int>vec;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
int main()
{
ios::sync_with_stdio(false);
int n,cas=1;
while(cin>>n,n)
{
vec.clear();
for(int i=1; i*i<=n; i++)
{
if(n%i==0)
{
vec.pb(i);
if(n/i!=i)
vec.pb(n/i);
}
}
int cnt=vec.size(),ans=0;
sort(vec.begin(),vec.end());
int tmp;
for(int i=0; i<cnt; i++)
{
for(int j=i; j<cnt; j++)
{
tmp=lcm(vec[i],vec[j]);
if(tmp==n) ans++;
//printf("ans=%d\n",ans);
}
}
cout<<n<<" "<<ans<<endl;
}
return 0;
}
也可以把n写成唯一分解式,利用分解的因子来求
可参考:http://blog.youkuaiyun.com/The_useless/article/details/53817026
http://blog.youkuaiyun.com/synapse7/article/details/11380309
若将数拆分成唯一分解式,可以发现
- 设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和b而言,对于n中存在的某一质因数pi则有max(ka,kb)=kn. 所以
当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 <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <sstream>
#include <vector>
#include <string>
#include <set>
#include <map>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define pb(x) push_back(x)
typedef long long LL;
const int mod=1e6;
const double eps=1e-6;
const int INF=0x3f3f3f3f;
const int N=205;
vector<int>vec;
int main()
{
ios::sync_with_stdio(false);
int n,cas=1;
while(cin>>n,n)
{
vec.clear();
int ans=1,tmp=n;
for(int i=2; i*i<=n; i++)
{
if(n%i==0)
{
int cnt=0;
vec.pb(i);
while(n%i==0)
cnt++,n/=i;
ans*=(cnt*2+1);
}
}
if(n>1) ans*=3;
ans=ans/2+1;
cout<<tmp<<" "<<ans<<endl;
}
return 0;
}