B标题:等差素数列
2,3,5,7,11,13,…是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
线性筛晒素数
模拟公差 遍历素数即可
#include
#include
#include
using namespace std;
#define PI 3.1415926535897932384626433832795028841971693993751058209749445923078164062
typedef long long ll;
typedef pair<int,int> PII;
ll mod=1e9+7;
ll read(){
ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
if(c == '-')Nig = -1,c = getchar();
while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
return Nig*x;}
int qow_m(int n,int w){
int k=1;while(w){if(w&1)k=k*n%mod; n=n*n%mod; w>>=1;}return k%mod; }
const int maxn =1e6+7 ;//..ll sum=1;
ll lowbit(ll x) {
return x&(-x);}
ll n,m,k,wz,cnt=0,num=0;
int pre[maxn];
int f[maxn];
void slu(){
f[1]=1;
for(int i=2;i<=maxn;i++){
if(!f[i]) pre[++cnt]=i;
for(int j=1;j<=cnt&&i*pre[j]<=maxn;j++){
f[i*pre[j]]=1;
if(i%pre[j]==0)
break;
}
}
}
int main(){
slu();
for(int i=1;i<=maxn;i++){
for(int j=1;j<=cnt;j++){
int temp=pre[j];
for(int k=1;k<10;k++){
if(temp+i>=maxn||f[temp+i]){
break;
}temp+=i;
if(k==9){
printf("%d",i);
return 0;
}
}
}
}
return 0;
}
C
模拟即可 找比例
#include
#include
#include
using namespace std;
#define PI 3.1415926535897932384626433832795028841971693993751058209749445923078164062
typedef long long ll;
typedef pair<int,int> PII;
ll mod=1e9+7;
ll read(){
ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
if(c == '-')Nig = -1,c = getchar();
while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
return Nig*x;}
int qow_m(int n,int w){
int k=1;while(w){
if(w&1)k=k*n%mod; n=n*n%mod; w>>=1;}return k%mod; }
const int maxn =1e6+7 ;//..ll sum=1;
ll lowbit(ll x) {
return x&(-x);}
ll n,m,k,wz,cnt=0,num=0;
double dp[521][520];
int main(){
for(int i=1;i<=29;i++){
for(int j=1;j<=i;j++){
cin>>dp[i][j];
}
}
for(int i=2;i<=30;i++){
for(int j=1;j<=i;j++){
dp[i][j]+=(dp[i-1][j-1]+dp[i-1][j])/2;
}
}
double maxa=0;
double mina=104812904;
for(int i=1;i<=30;i++){
maxa=max(maxa,dp[30][i]);
mina=min(mina,dp[30][i]);
}
printf("%.lf",maxa*(2086458231/mina));
return 0;
}
dfs模拟分割路线 对称分割 由于旋转不算 答案/4 509
#include
#include
#include
using namespace std;
#define PI 3.1415926535897932384626433832795028841971693993751058209749445923078164062
typedef long long ll;
typedef pair<int,int> PII;
ll mod=1e9+7;
ll read(){
ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
if(c == '-')Nig = -1,c = getchar();
while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
return Nig*x;}
int qow_m(int n,int w){
int k=1;while(w){
if(w&1)k=k*n%mod; n=n*n%mod; w>>=1;}return k%mod; }
const int maxn =1e6+7 ;//..ll sum=1;
ll lowbit(ll x) {
return x&(-x);}
ll n,m,k,wz,cnt=0,ans=0;
int vis[521][520];
int dis[4][2]={
{
1,0},{
-1,0},{
0,1},{
0,-1}};
int lu[100][100];
void dfs(int x,int y){
if(x==0||x==6||y==0||y==6){
ans++;
return;
}
for(int i=0;i<4;i++){
int dx=x+dis[i][0];
int dy=y+dis[i][1];
if(!vis[dx][dy]){
vis[dx][dy]=1;
vis[6-dx][6-dy]=1;
dfs(dx,dy);
vis[dx][dy]=0;
vis[6-dx][6-dy]=0;
}
}
}
int main(){
n=6;
vis[3][3]=1;
dfs(3,3);
cout<<ans/4;
return 0;
}
补充lcs
练习一下lcs
#include
#include
#include
using namespace std;
#define PI 3.1415926535897932384626433832795028841971693993751058209749445923078164062
typedef long long ll;
typedef pair<int,int> PII;
ll mod=1e9+7;
ll read(){
ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
if(c == '-')Nig = -1,c = getchar();
while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
return Nig*x;}
int qow_m(int n,int w){
int k=1;while(w){
if(w&1)k=k*n%mod; n=n*n%mod; w>>=1;}return k%mod; }
const int maxn =1e6+7 ;//..ll sum=1;
ll lowbit(ll x) {
return x&(-x);}
ll n,m,k,wz,cnt=0,ans=0;
int vis[521][520];
int dis[4][2]={
{
1,0},{
-1,0},{
0,1},{
0,-1}};
int lu[100][100];
void lcs(string a,string b,int l1,int l2){
int ls[100][100];
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
if(!i||!j){
ls[i][j]=0;
}
else if(a[i-1]==b[j-1]){
ls[i][j]=ls[i-1][j-1]+1;
}
else{
ls[i][j]=max(ls[i-1][j],ls[i][j-1]);
}
}
}
cout<<ls[l1][l2];
}
int main(){
string a,b;
cin>>a>>b;
lcs(a,b,a.size(),b.size());
return 0;
}