http://acm.hdu.edu.cn/showproblem.php?pid=1492
题意:
丑数:仅由2,3,5,7这四种素因子构成的数
求一个丑数的素因子,直接唯一分解定理分解
ac:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll n,ans;
int a,b,c,d;
while(scanf("%lld",&n)&&n!=0)
{
a=b=c=d=1;//+1
ans=1;
while(1)
{
if(n%2==0&&n!=1)
{
n=n/2;
a++;
}
else if(n%3==0&&n!=1)
{
n=n/3;
b++;
}
else if(n%5==0&&n!=1)
{
n=n/5;
c++;
}
else if(n%7==0&&n!=1)
{
n=n/7;
d++;
}
else break;
}
printf("%d\n",a*b*c*d);
}
return 0;
}
https://ac.nowcoder.com/acm/contest/82/A?&headNav=www
题意:
求1~n中因子最多的数的个数
解析:
根据唯一分解定理,贪心得:尽量让前面的数的指数大,指数排列呈单调递减
ac:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll cnt;
ll n;
ll prime[17]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,51};
void dfs(int pos,int len,ll q,int ans)//第pos个素数,前一位素因子指数len,ans当前因子个数,q为该数的值
{
if(ans>cnt)
cnt=ans;
ll g=1;
for(int i=1;i<=len;i++)
{
g=g*prime[pos];
if(n/g<q)
break;
dfs(pos+1,i,q*g,ans*(i+1));
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
cnt=0;
scanf("%lld",&n);
dfs(1,30,1,1);
printf("%d\n",cnt);
}
return 0;
}