https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=589&problem=4407&mosmsg=Submission+received+with+ID+1528513
Factors
The fundamental theorem of arithmetic states that every integer greater than 1 can be uniquely represented as a product of one or more primes. While unique, several arrangements of the prime factors
may be possible. For example:
10 = 2 * 5 20 = 2 * 2 * 5
= 5 * 2 = 2 * 5 * 2
= 5 * 2 * 2
Let f (k) be the number of di erent arrangements of the prime factors of k. So f (10) = 2 and
f (20) = 3.
Given a positive number n, there always exists at least one number k such that f (k) = n. We want
to know the smallest such k.
Input
The input consists of at most 1000 test cases, each on a separate line. Each test case is a positive
integer n < 2
63
.
Output
For each test case, display its number n and the smallest number k > 1 such that f (k) = n. The
numbers in the input are chosen such that k < 2
63
.
Sample Input
1
2
3
105
Sample Output
1 2
2 6
3 12
105 720
其实没judge 因为uvalive的评测有问题 我自己测的数据反正跟之前AC的结果一样。。。。
但是我二逼的是----因为不能judge,我就拿别的AC代码对拍作为judge, 不合法的情况输出应该是设定的INF,然后我设定的最大值跟AC代码设定的INF不一样,我以为自己错了,就debug了好几天,今天发现,卧槽,,,,其实我的可能一直都是对的啊,,,当然以后uvalive好了再说
思路就是反素数了,具体看教程http://blog.youkuaiyun.com/u011026968/article/details/38784687
然后写的话,就很容易了,就是跟http://blog.youkuaiyun.com/u011026968/article/details/38787473 很想,基本直接copy
我的代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const int INF = 100000000;
const int maxc=100;
//const int MOD = 1e9+7;
ll C[maxc][maxc];
void calC(){ // C(n,k),n个数里选k个
int i,j;
for(int i=0;i<maxc;i++) C[i][i]=C[i][0]=1LL;
for(int i=2;i<maxc;i++)
for(j=1;j<i;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1]);//%MOD;
}
const int SIZE = 21;
int p[SIZE] = {2,3,5,7,11,
13,17,19,23,29,
31,37,41,43,47,
53,59,61,67,71,73};//7;53;59;61;67;71;73
ll ans,n;
void dfs(ll tmp, int dep, int num, ll ret,int cc)
{
///////////////////////
//printf("tmp=%lld dep=%d num=%d ret=%lld cc=%d\n",tmp,dep,num,ret,cc);
////////////////////////
if(ret == n)
ans=min(ans,tmp);
if(ret>=n || dep>SIZE-1 )return;
ll tt=1;
for(int i=1;i<num;i++)
{
tt*=p[dep];
/////////////////
//printf("n=%lld le=%lld %lld ri=%lld %lld\n",n,n/ret,C[cc+i][i],ans/tt , tmp);
/////////////////////
//if(n/ret > C[cc+i][i] || ans/tt < tmp)break;//
if(ans/tt < tmp)break;
//if(cc+i>64)break;
dfs(tmp*tt,dep+1,i+1,ret*C[cc+i][i],cc+i);
}
}
int main()
{
//IN("uva6396.txt");
calC();
while(~scanf("%lld",&n))
{
ans=ll_INF;
if(n == 1)ans=2;
else dfs(1, 0, 65, 1, 0);
printf("%lld %lld\n",n,ans);
}
return 0;
}
AC代码两份:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define FOR(i, x, y) for(int i = x; i <= y; i++)
#define oo 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll N;
ll C[65][65];
int P[20];
bool isPrime(int n)
{
FOR(i, 2, sqrt(n))
if(n % i == 0) return 0;
return 1;
}
void init()
{
FOR(i, 0, 64)
{
C[i][0] = 1;
FOR(j, 1, i)
C[i][j] = C[i-1][j] + C[i-1][j-1];
}
FOR(i, 2, 64)
if(isPrime(i))
P[++P[0]] = i;
}
ll ans;
int a[65];
int sum[65];
void dfs(int dep, ll s)
{
if(s == 1)
{
double temp = 0;
FOR(i, 1, dep - 1)
temp += a[i] * log(P[i]);
ll t = 1;
if(temp < 63 * log(2))
{
FOR(i, 1, dep - 1)
FOR(j, 1, a[i])
t *= P[i];
ans = min(ans, t);
}
}
if(s <= 1) return;
FOR(i, 1, a[dep - 1])
{
a[dep] = i;
sum[dep] = sum[dep-1] + i;
if(sum[dep] > 64) break;
if(C[sum[dep]][i] && s % C[sum[dep]][i] == 0)
dfs(dep + 1, s / C[sum[dep]][i]);
}
}
ll solve()
{
ans = 9223372036854775807L;
a[0] = 64;
dfs(1, N);
if(N == 1) ans = 2;
return ans;
}
int main()
{
init();
while(scanf("%lld", &N) != EOF)
{
printf("%lld %lld\n", N, solve());
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <utility>
#include <map>
using namespace std;
#define IN(s) freopen(s,"r",stdin)
#define maxn 1009
int p[]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
typedef unsigned long long ull;
ull mod = 1000000007;
const ull INFULL=(ull)(-1LL);
map<ull,ull> ans;
ull n[maxn];
bool safemul(ull &c,int x)
{
if((c*x)%mod!=((c%mod)*x)%mod)
return false;
c*=x;
return true;
}
ull qpow(ull a,ull n,ull mod)
{
ull b=1;
a%=mod;
while(n)
{
if(n&1) b*=a,b%=mod;
a*=a,a%=mod;
n>>=1;
}
return b;
}
void dfs(int t,int s,int sum,ull a,ull b,ull c)
{
ull tmp = b*qpow(a,mod-2,mod)%mod;
if(ans.find(tmp)!=ans.end()){
ull &x = ans[tmp];
if(x>c) x=c;
}
if(t>15)
return;
int i;
for(i=1;i<=s;i++){
b*=i+sum,b%=mod;
a*=i,a%=mod;
if(!safemul(c,p[t])) return;
dfs(t+1,i,sum+i,a,b,c);
}
}
int main()
{
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
//IN("uva6396.txt");
int p=0;
while(cin>>n[++p]){
ans[n[p]%mod]=INFULL;
}
p--;
dfs(1,64,0,1,1,1);
int i;
for(i=1;i<=p;i++){
if(n[i]==1){
cout<<"1 2"<<endl;
continue;
}
cout<<n[i]<<" "<<ans[n[i]%mod]<<endl;
}
return 0;
}