BZOJ 3181([Coci2012]BROJ-最小质因子为p的第k小素数)
3181: [Coci2012]BROJ
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 26
Solved: 7
[
Submit][
Status]
Description
求最小质因子等于p的第n小的正整数(恰好有n-1个最小质因子等于p且比它
小的正整数)。p一定是质数。若答案超过10^9则输出0。
Input
Output
Sample Input
Sample Output
HINT
1 <= n, p <= 10^9
Source
当n≥29时,枚举p的倍数,暴力可过。
当n<29时:暴力枚举不可过
开始找规律---发现循环节
设C为≤p的素数之积
经过cwj的证明:
若P<29,可以直接计算,设C为<=P的质数的积,由于P不大,C只是百万级的,硬统计C内有多少个符合要求,设符合要求的个数为c,则答案为((N-1)/c)*C+a[(N-1)%c+1],其中a[i]为第i个符合要求的数,现证明其正确性。
我们认为,若i合法,则C+i合法。
现反设C+i非法,则存在p<P满足p|C+i,因为C为<=P的质数的积,所以p|C,所以p|i,与假设矛盾,得证。
若i合法,则i%c必然合法。故i=a[k]+t*C (t>0)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define F (1000000009)
#define MAXN (1000000000)
#define MAXP (5000000)
typedef long long ll;
ll n,p;
int a[300]={0},size=0;
bool b[300]={0};
void make_prime(int n)
{
size=0;
b[1]=1;
Fork(i,2,n)
{
if (!b[i]) a[++size]=i;
For(j,size)
{
if (i*a[j]>n) break;
b[i*a[j]]=1;
if (i%a[j]==0) break;
}
}
}
int ans[10000000],tot=0;
int main()
{
// freopen("bzoj3181.in","r",stdin);
while (cin>>n>>p)
{
if (n==1) {cout<<p<<endl;continue;}
if (p>sqrt(MAXN)) {cout<<'0'<<endl;continue;}
if (p>=29)
{
int k=1;
for(int i=2*p;i<=MAXN;i+=p)
{
bool bo=0;
Fork(j,2,p-1)
if (i%j==0) {bo=1;break;}
if (!bo) k++;
if (k==n) {cout<<i<<endl;break;}
}
if (k<n) puts("0");
}
else
{
make_prime(p);
ll C=1;
For(i,size) C*=a[i];//,cout<<C<<endl;
tot=0;
for(ll i=p;i<=C&&i<=MAXN;i+=p)
{
bool bo=0;
For(j,size)
{
if (i%a[j]==0&&a[j]<p) {bo=1;break;}
}
if (!bo) ans[++tot]=i;
}
//if (n<=tot) cout<<ans[n]<<endl;
// if (tot==0) {puts("0");return 0;}
ll ans2=(ll)(n-1)/tot*C+ans[(n-1)%tot+1];
if (ans2>MAXN) puts("0");
else cout<<ans2<<endl;
}
// return 0; }
return 0;
}
BZOJ 3181([Coci2012]BROJ-最小质因子为p的第k小素数)的更多相关文章
- 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...
- BZOJ.2588.Count on a tree(主席树 静态树上第k小)
题目链接 /* 序列上的主席树 某点是利用前一个点的根建树 同理 树上的主席树 某个节点可以利用其父节点(is unique)的根建树 排名可以利用树上前缀和求得: 对于(u,v),w=LCA(u,v ...
- bzoj3181: [Coci2012]BROJ
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- Educational Codeforces Round 89 (Rated for Div. 2)D. Two Divisors 线性筛质因子
题目链接:D:Two Divisors 题意: 给你n个数,对于每一个数vi,你需要找出来它的两个因子d1,d2.这两个因子要保证gcd(d1+d2,vi)==1.输出的时候输出两行,第一行输出每一个 ...
- Minimum Sum LCM UVA - 10791(分解质因子)
对于一个数n 设它有两个不是互质的因子a和b 即lcm(a,b) = n 且gcd为a和b的最大公约数 则n = a/gcd * b: 因为a/gcd 与 b 的最大公约数也是n 且 a/gcd ...
- hdu 5428 质因子
问题描述有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大.幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个 ...
- hdu6237 分解质因子
题意:给一堆石子,每次移动一颗到另一堆,要求最小次数使得,所有石子数gcd>1 题解:枚举所有质因子,然后找次数最小的那一个,统计次数时,我们可以事先记录下每堆石子余质因子 的和,对所有石子取余 ...
- Openjudge 1.13-21:最大质因子序列(每日两水)
总时间限制: 1000ms 内存限制: 65536kB 描述 任意输入两个正整数m, n (1 < m < n <= 5000),依次输出m到n之间每个数的最大质因子(包括m和n ...
- hdu5317 RGCDQ (质因子种数+预处理)
RGCDQ 题意:F(x)表示x的质因子的种数.给区间[L,R],求max(GCD(F(i),F(j)) (L≤i<j≤R).(2<=L < R<=1000000) 题解:可以 ...
随机推荐
- ubuntu查看硬件信息
1,外部探针probe sudo apt-get install hwinfo 执行hwinfo获取系统信息 --short
- PHP MySQL Select 之Select
从数据库表中选取数据 SELECT 语句用于从数据库中选取数据. 语法 SELECT column_name(s) FROM table_name 注释:SQL 语句对大小写不敏感.SELECT 与 ...
- popToViewController用法
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIn ...
- HDU 1695 GCD 欧拉函数+容斥定理
输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...
- 【git学习二】git基础之git管理本地项目
1.背景 git基础打算分两部分来说,一部分是对于本地项目的管理,第二部分是对于远程代码仓库的操作. git运行本地项目管理包含对于相关文件的追踪,暂存区的比較分析,提交,撤销等功能. ...
- 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone
一.质点系重心公式 x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M (M=m1+m2+m3+m4...+mn) 二.三角形重心 可直接求得,但在多边形剖分中 各三角形的质点的质量 ...
- with ffmpeg to encode video for live streaming and for recording to files for on-demand playback
We've been doing some experimentation with ffmpeg to encode video for live streaming and for recordi ...
- Path Sum,Path Sum II
Path Sum Total Accepted: 81706 Total Submissions: 269391 Difficulty: Easy Given a binary tree and a ...
- R - 一只小蜜蜂...(第二季水)
Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. ...
- [makefile] filter-out
$(filter-out ,) 名称:反过滤函数——filter-out.功能:以模式过滤字符串中的单词,去除符合模式的单词.可以有多个模式.返回:返回不符合模式的字串.示例: objects=mai ...