【枚举+小技巧】【TOJ4115】【Find the number】
2015-07-10 17:21
323 查看
题目大意
找到一个最小的奇数
约数个数为n
结果mod10^9+7
根据 约数个数=(p1+1)*(p2+1)............
将n 枚举分解成连乘式。(枚举个数,dfs)
比较大小 log 了 比较
代码如下:
找到一个最小的奇数
约数个数为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(); } }
相关文章推荐
- CM12.1源码编译并刷机到三星N5100
- 轻应用 lapp
- 关于android程序运行时死打问题
- KALI屏幕录像
- python学习笔记——Tkinter GUI编程——简介
- Computer Networks A System Approach
- 程序日志--ios“打开网页url连接”程序
- 记中兴软件园一个月实训(三)
- KALI屏幕录像
- JavaScript实现的类字典插入或更新方法实例
- linux之cp/scp命令+scp命令详解
- SQL Server执行计划的理解
- 获取iframe的url
- 一个简单的网络框架
- javascirpt 的一些在IE下不支持的函数小结
- MongoDB oplog 深入剖析
- Could not flush the DNS Resolver Cache: 执行期间,函数出了问题
- http协议中:GET/POST/PUT/DELETE/INPUT/TRACE/OPTIONS/HEAD方法
- Home键和Back键的Android生命周期总结与比较
- Executor--线程的执行器