(UVA

来源:互联网 发布:java linklist方法 编辑:程序博客网 时间:2024/06/06 01:01

链接: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.csdn.net/The_useless/article/details/53817026
http://blog.csdn.net/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;}
原创粉丝点击