本来想看看oeis有没有这个数的性质,没找到。。。
题目:https://www.nowcoder.com/acm/contest/158/D
将所有形如ax+1的数称为a-贝利福斯数,其中x是正整数。
一个a-贝利福斯数是a-贝利福斯素数,当且仅当它不能被分解成两个a-贝利福斯数的积。
现在给出a,n,问有多少个 ≤ n的a-贝利福斯数可以被分解成两个a-贝利福斯素数的积。
输入描述:
一行两个数a,n
输出描述:
一行一个数表示答案
示例1
输入
复制
4 25
输出
复制
1
说明
≤ 25 的 4-贝利福斯数有5,9,13,17,21,25。 其中4-贝利福斯素数有5,9,13,17,21, 可以被分解成两个a-贝利福斯素数的积只有25。
备注:
1 ≤ a ≤ 10,1 ≤ n ≤ 2 x 107 x a
注意这个n给出的方式与a有关,当然可以直接a取10,判断n的范围,但是可以从题目中隐约感觉出题目疯狂暗示从(n-1)/a入手,这些数字之间应该有规律。
所以我们直接在axy+x+y身上找规律就行了
具体做法基本和素数筛一个样,只不过判素性的条件变了变。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e7+5;
bool vis[N];
ll prime[N];
bool ans[N];
int main()
{
ll tot = 0;
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
ll n, a;
scanf("%lld%lld",&a, &n);
n = (n - 1) / a;
for(int i = 1;i <= n;i++)
{
bool pr = false;
if(!vis[i])
pr = true, prime[++tot] = i;
for(int j = 1;j <= tot && prime[j] + i + prime[j] * a * i <= n;j++)
{
ll tmp = prime[j] + i + prime[j] * a * i;
vis[tmp] = 1;
if(pr)
ans[tmp] = true;
}
}
int sum = 0;
for(int i = 1;i <= n; i++)
sum+=ans[i];
printf("%d\n",sum);
return 0;
}