1201: 约数
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 14 Solved: 4 [Submit][Status][Web Board]Description
我们定义F(n)为n的约数个数(包含1和它本身),例如F(6)=4;
求F(n)想必大家都会,今天UnkelTao想知道的是,[1=<i<=n]最大的F(i)是多少呢?
Input
输入第一行为数据组数 T(T <= 100)。
对于每组数据,只有一个数字 n(1 <= n <= 10^9)
Output
对于每组数据,请在一行中输出两个数,即i从 [1, n]中最大的F(i),输出i和F(i);用一个空格隔开,如果有相同的F(i)输出最小的i。格式见样例。如果使用大数,请用long long而非__int64;(long long大小为10^18次方左右)输入输出则使用(sacnf("%lld",&n)和printf("%lld",n); 或者cin,cout)
Sample Input
3 10 20 30
Sample Output
6 4 12 6 24 8
解法:
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
long long ss[10]={2,3,5,7,11,13,17,19,23,29};
long long n,da[10],ans,xxx;
int js() //计算当前状态下枚举出的数字的因子个数
{
int i;
long long tot=1;
for (i=0;i<10;i++)
{
if (da[i]==0) break;
tot*=(da[i]+1);
}
return tot;
}
void search(int x,int tot) //由素数表枚举数
{
long long tt,t;
t=tot;
if (tot*ss[x]>n)
{
tt=js();
if (tt>ans){ans=tt;xxx=tot;}
if (tt==ans)
if (tot<xxx) xxx=tot;
return;
}
while (1)
{
t*=ss[x];
if (t>n) break;
da[x]++;
search(x+1,t);
}
da[x]=0;
}
int main()
{
int ttt,ll;
long long x,t;
cin>>ttt;
for (ll=1;ll<=ttt;ll++)
{
cin>>n;
if (n==1){cout<<"1 1"<<endl;continue;}
memset(da,0,sizeof(da));
ans=0;
search(0,1);
cout<<xxx<<" "<<ans<<endl;
}
}