题目大意:
求出最小的正整数,它的约数有$2^{500500}$个。

思路:
考虑将一个数质因数分解,如果它的约数有$2^{500500}$个, 那么每个质因子的指数一定是$2^k-1$这样的形式。

如果把质因子$p$的指数从$2^k-1$增大到$2^{k+1}-1$ 那么相当于在原数的基础上乘以$p^{2^k}$.

所以就可以贪心了, 一开始把足够多的质数放进小根堆里,然后每次取出最小的$x$, 把答案乘上$x$, 然后把$x^2$ 加入堆里。

代码:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <set>
#include <cstring>
#include <map>
#include <queue>
using namespace std; typedef long long ll;
#define N 10000000
#define M 1100
typedef pair<int,int> pii; bool flag[N];
int p[N],phi[N]; void Get_Primes()
{
phi[]=;
for (int i=;i<N;i++)
{
if (!flag[i]) p[++p[]]=i,phi[i]=i-;
for (int j=;j<=p[] && i*p[j]<N;j++)
{
flag[i*p[j]]=true;
if (i%p[j]==)
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
else phi[i*p[j]]=phi[i]*(p[j]-);
}
}
} priority_queue<ll, vector<ll>, greater<ll> > Q; int main()
{
freopen("in.in","r",stdin);
freopen("out.out","w",stdout); ll ans = , mod = ;
Get_Primes();
for (int i = ; i <= ; ++i) Q.push(p[i]);
for (int i = ; i <= ; ++i)
{
ll x = Q.top();
ans = x % mod;
Q.pop(), Q.push(x * x);
}
cout << ans << endl;
return ;
}

答案:35407281

最新文章

  1. SharePoint 2013 图文开发系列之自定义字段
  2. BZOJ2285 : [Sdoi2011]保密
  3. 全程图解 手把手教您开启windows终端服务
  4. 解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义重复
  5. highcharts 结合phantomjs纯后台生成图片系列二之php
  6. [Effective C++ --029]为“异常安全”而努力是值得的
  7. Page Object 模式编写UiAutomator脚本
  8. 初识DSP
  9. ThinkPHP - 自定义标签库 - 标签驱动
  10. 内功心法 -- java.util.ArrayList&lt;E&gt; (1)
  11. vim环境设置(应用于python编程)
  12. jquery的done和then区别
  13. 查看Zookeeper服务器状态信息的一些命令
  14. TrieTree
  15. 16路PWM输出的pca9685模块
  16. 数据挖掘(二)——Knn算法的java实现
  17. Hadoop记录-安装ambari hdp集群
  18. Android的Databinding-RecyleView绑定
  19. 【Spring】30、Spring,SpringMVC用法汇总
  20. js动态控制表单表格

热门文章

  1. oracle 百万行数据优化查询
  2. mac下更新自带的PHP版本到5.6或7.0
  3. Swift,字符串
  4. pwn2own
  5. MongoDB集群设置集合分片生效及查看集合分片情况
  6. Node.js meitulu图片批量下载爬虫1.06版
  7. Objective-C学习笔记(二十一)——函数的返回值与參数类型
  8. OpenERP7.0 忘记admin管理员密码解决办法
  9. web报表工具FineReport常见的数据集报错错误代码和解释
  10. WP8滑动条(Slider)控件的使用