【枚举+小技巧】【TOJ4115】【Find the number】
题目大意
找到一个最小的奇数
约数个数为n
结果mod10^9+7
根据 约数个数=(p1+1)*(p2+1)............
将n 枚举分解成连乘式。(枚举个数,dfs)
比较大小 log 了 比较
代码如下:
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include<algorithm> #include <sstream> #include <string> #define oo 0x13131313 using namespace std; int n; int ok; int q[30]={0,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71}; int A[30]; int B[30]; int ans[30]; int anscishu=0; double MAX=1<<30; const long long mod=1000000007; void dfs(int nn,int k,int now,int cishu) { if(k==1) { if(nn==1) return ; A[1]=nn; double t=0; for(int i=1;i<=cishu;i++) B[i]=A[i]; sort(B+1,B+cishu+1); for(int i=1;i<=cishu;i++) { t=t+(double)(B[i]-1)*(double)log(q[cishu-i+1]); } if(t<MAX) { MAX=t; anscishu=cishu; for(int i=1;i<=cishu;i++) { ans[i]=B[i]; } } ok=1; return ; } for(int i=now;i<=nn;i++) { if(nn%i==0) { A[k]=i; dfs(nn/i,k-1,i,cishu); } } } void solve() { MAX=1<<31-1; for(int i=1;i<=17;i++) { ok=0; dfs(n,i,2,i); if(ok==0) break; } } void print() { long long Ans=1; for(int i=1;i<=anscishu;i++) { for(int j=1;j<=ans[i]-1;j++) { Ans=(Ans*(long long)q[anscishu-i+1])%mod; } } printf("%lld\n",Ans); } int main() { // freopen("a.in","r",stdin); //freopen("a.out","w",stdout); while(cin>>n) { solve(); print(); } }