196. 质数距离
给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对。
同时,你还需要找到距离最远的两个相邻质数D1和D2(即D1-D2是最大的),如果存在相同距离的其他相邻质数对,则输出第一对。
输入格式
每行输入两个整数L和U,其中L和U的差值不会超过1000000。
输出格式
对于每个L和U ,输出一个结果,结果占一行。
结果包括距离最近的相邻质数对和距离最远的相邻质数对。(具体格式参照样例)
如果L和U之间不存在质数对,则输出“There are no adjacent primes.”。
数据范围
1≤L<U≤2^31−1
输入样例:
2 17
14 17
输出样例:
2,3 are closest, 7,11 are most distant.
There are no adjacent primes.
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1000010, M = 50010;
int primes[N], cnt;
bool st[N];
void get_primes(int n) //线性筛法 求1-n所有质数
{
memset(st, false, sizeof st);
cnt = 0;
for(int i = 2; i <= n; i++)
{
if(!st[i]) primes[cnt ++] = i; //如果没有被筛过 就是质数
for(int j = 0; primes[j] * i <= n; j++)
{
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
}
int main()
{
long long l, r;
while (cin >> l >> r)
{
get_primes(50000);
memset(st, false, sizeof st);//初始化晒数组st
for(int i = 0; i < cnt; i++)
{
int p = primes[i];
//把[l, r]中所有p的倍数筛掉
for(long long j = max((l + p - 1) / p * p, 2ll * p); j <= r; j += p)
st[j - l] = true; // j - l
}
cnt = 0;
for(int i = 0; i <= r - l; i ++)
if(!st[i] && i + l > 1)
primes[cnt ++] = i + l;
// for(int i = 0; i < cnt; i++) cout << primes[i] << ' ';
// cout << endl;
if(cnt < 2) puts("There are no adjacent primes.");
else //找相邻质数最小值
{
int minp = 0, maxp = 0;
for(int i = 0; i + 1 < cnt; i ++)
{
int d = primes[i + 1] - primes[i];
if(d < primes[minp + 1] - primes[minp]) minp = i;
if(d > primes[maxp + 1] - primes[maxp]) maxp = i;
}
printf("%d,%d are closest, %d,%d are most distant.\n", primes[minp], primes[minp + 1], primes[maxp], primes[maxp + 1]);
}
}
return 0;
}
197. 阶乘分解
给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pi 和 ci即可。
输入格式
一个整数N。
输出格式
N! 分解质因数后的结果,共若干行,每行一对pi,ci,表示含有pcii项。按照pi从小到大的顺序输出。
数据范围
1≤N≤10^6
输入样例:
5
输出样例:
2 3
3 1
5 1
样例解释
5!=120=2^335
#include <iostream>
using namespace std;
const int N = 1000010;
int primes[N], cnt;
bool st[N];
void get_primes(int n)
{
for(int i = 2; i <= n; i ++)
{
if(!st[i]) primes[cnt ++] = i;
for(int j = 0; primes[j] * i <= n; j++)
{
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
}
int main()
{
int n;
cin >> n;
get_primes(n);
for(int i = 0; i < cnt; i++) //枚举质数
{
int p = primes[i];
int s = 0, t = n; //求质数p的次数
while(t) s += t / p, t /= p; //拿掉p的倍数
printf("%d %d\n", p, s);
}
return 0;
}