Problem 500!!!

The number of divisors of 120 is 16.
In fact 120 is the smallest number having 16 divisors.

Find the smallest number with 2500500 divisors.
Give your answer modulo 500500507.

前500500个质数是第一个假的解,然后维护一个"乱七八糟的数据结构"里面存着第一个质数的平方,第二个质数的平方,...,然后每次把这个数据结构里最小的那个和当前解最大的单幂次质数做个比较,如果那个元素更小就替换,然后在数据结构里推进刚刚用来替换的那个形如p^k的数的平方......大概就这么个思路吧...

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 500500507;
const ll mi = 500500+1;
const ll maxn = 2e7;//从2开始,到第500500个素数是7e6左右
ll a[4] = {2, 4, 8, 16};
ll prime[mi+100];
ll check[maxn], tot;
void init(){memset(check, 0, sizeof(check));prime[tot++] = 1;for (ll i = 2; i < maxn; ++i){if(!check[i]){prime[tot++] = i;}if(tot == mi){break;}for (ll j = 1; j < tot; ++j){if (i * prime[j] > maxn){break;}check[i*prime[j]] = 1;if (i % prime[j] == 0){break;}}}
}
//快速幂,返回a^b
ll Pow(ll a,ll b)
{ll ret=1;while(b){if(b&1) ret=(ret*a)%mod;a=(a*a)%mod;b>>=1;}return ret;
}int main(){init();priority_queue<ll>que;que.push(1);ll Size = 1;ll Top = 4;for(ll i = 1; i < mi; i++){if(Size >= mi){if(prime[i] >= que.top()){break;}else{que.pop();que.push(prime[i]);for(ll j = 0; j < Top; j++){if(Pow(prime[i], a[j]) >= prime[tot-1]){Top = j;break;}if(Pow(prime[i], a[j]) >= que.top()){Top = j;break;}else{que.pop();que.push(Pow(prime[i], a[j]));}}}}else{que.push(prime[i]);Size++;for(ll j = 0; j < Top; j++){if(Pow(prime[i], a[j]) >= prime[tot-1]){Top = j;break;}if(Size >= mi){if(Pow(prime[i], a[j]) >= que.top()){Top = j;break;}else{que.pop();que.push(Pow(prime[i], a[j]));}}else{if(Pow(prime[i], a[j]) >= prime[tot-1]){Top = j;break;}que.push(Pow(prime[i], a[j]));Size++;}}}}ll ans = 1;while(!que.empty()){ans *= que.top();que.pop();ans%=mod;}cout<<ans<<endl;return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 500500507;
const ll N = 500500;
const ll L =N*16;
ll np[L+1];struct xpowy{ll x,y;bool operator <(xpowy &b){return log(x)*(y+1)>log(b.x)*(b.y+1);}
};
//快速幂,返回a^b
ll Pow(ll a,ll b)
{ll ret=1;while(b){if(b&1) ret=(ret*a)%mod;a=(a*a)%mod;b>>=1;}return ret;
}int main(){vector<xpowy> v;for(ll n=2;n<=L;n++)if(!np[n]){for(ll x=n*n;x<=L;x+=n)np[x]=1;v.push_back({n,0});}make_heap(v.begin(),v.end());for(int i=0;i<N;i++){v[0].y=v[0].y*2+1;pop_heap(v.begin(),v.end());push_heap(v.begin(),v.end());}ll s=1;for(int i=0;i<v.size();i++)s=s*Pow(v[i].x,v[i].y)%mod;cout<<s;
}

ProjectEuler500 【组合数学】【数论】相关推荐

  1. 模意义下的FFT算法

    //写在前面 单就FFT算法来说的话,下面只给出个人认为比较重要的推导,详细的介绍可参考 FFT算法学习笔记 令v[n]是长度为2N的实序列,V[k]表示该实序列的2N点DFT.定义两个长度为N的实序 ...

  2. [存档]xx-09210xxx-2010-ACM-ICPC竞赛总结

    存档作对比.发现完全没进步啊,真惭愧. ==== ACM-ICPC亚洲区预选赛 分区赛竞赛个人总结 2010年赛季 一.个人训练情况 1.训练的数量与质量情况 做题总数: 231=128(BuptOJ ...

  3. 北大ACM暑期培训课程目录

    本文出自:http://blog.csdn.net/svitter 目录: 北大ACM暑期培训课程目录(二)(搜索) 北大ACM暑期培训课程目录(三)(图论) 北大ACM暑期培训课程目录(四)(计算几 ...

  4. 数论 II(组合数学)

    数论 II(组合数学) >> 排列数 定义 排列(ArrangmentArrangmentArrangment)数指的是从 nnn 个不同元素中任取 m(m⩽n)m\ (m\leqslan ...

  5. 组合数学(排列组合,容斥原理,数论定理)

    组合数学的学习 排列组合 一.排列组合基础 二.排列组合练习题 容斥原理 定理学习 例题练习 例题1: [ 1 , n ] [1,n] [1,n] 中有多少个数能被 x 或 y 整除 例题2: [ 1 ...

  6. 算法基础 - 数论 | 组合数学 卡特兰数(Catalan number)定义、证明及例题

    写在前面:卡特兰数这东西感觉挺常用的,并且公式很简单,那就花一下午总结一下,学点皮毛吧(反正遇到我还是不会 ) [PDF] 大三上组合数学课堂讲义 文章目录 卡特兰数定义 卡特兰数的性质 卡特兰数证明 ...

  7. Codeforces 396A 数论,组合数学

    题意:给一个a数组,求b 数组的方案数,但是要求两者乘积相同. 分析: 不可能将它们乘起来,对于每个数质因数分解,得到每个质因子个数,遍历这些质因子,将某个质因子放到 对应的盒子里面,可以不放,方案数 ...

  8. 0x35.数论 - 组合数学与计数

    目录 一.计数原理 1.加法原理 2.乘法原理 3.减法原理 二.排列组合 1.排列数 2.组合数 3.数学题 三.组合数的计算 1. 加法递推O(n2)O(n^2)O(n2) 2. 乘法递推O(n) ...

  9. Codeforces Round #450 (Div. 2)D. Unusual Sequences[数论][组合数学][dp II]

    题目:http://codeforces.com/contest/900/problem/D 题意:找到加和为m的且gcd为n的数列种类数 分析:可以转化为求gcd为1的加和为m/n的种类数,假设有m ...

最新文章

  1. 7999元大疆最新无人机,支持第一人称视角极速拍摄,直接起飞
  2. 循环训练_力量循环训练
  3. 冲动当机立断(2006-01-19 16:58:32)(新浪)
  4. java函数名没有加throw_C++函数声明后面加throw()的作用
  5. Web前端好学吗 学完之后能干什么
  6. boost::vf2_subgraph_iso用法的测试程序
  7. java 三种将list转换为map的方法详解
  8. Thunder团队Beta周贡献分分配结果
  9. Java数组,Wat!
  10. Spring Boot----整合SpringCloud
  11. JAVA知识基础(六):抽象
  12. 计算机ip地址无法修改密码,手提电脑怎么修改无线网络的IP地址|无线网络怎么修改密码...
  13. Unity的Animator中Transition有延迟的问题
  14. JAVA虚拟机内存分配原则 (转
  15. Android Wear 发布 4 年终改名,继续艰难存活
  16. javascript——forEach跳出循环
  17. 正确的理解MySQL的MVCC及实现原理
  18. 中调用view_在 View 上使用挂起函数
  19. 小程序学习笔记(1)-基本了解
  20. 5分钟商学院-个人篇-沟通能力

热门文章

  1. Kruskal+LCA【p2245】 星际导航
  2. 64位Win7安装Oracle12C临时位置权限错误解决方案
  3. cocos2d-x中集成protoc-gen-lua
  4. 贪吃蛇游戏(附源码)
  5. 我的MIDAS中间层服务器运行效果图
  6. 将SQL中数据输出到Excel中
  7. php 主页子标题修改,关于有部分用户默认PC主页大标题标签修改无效的答疑.
  8. oracle中sp,sp是什么?
  9. linux脚本重启进程,linux下通过脚本实现自动重启程序
  10. 犀牛重建曲面_犀牛建模渐消面处理