兄弟素数
所谓兄弟素数指的就是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了,就象兄弟一样。
最小的兄弟素数是 (3, 5),在 100 以内的孪生素数还有 (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61) 和 (71, 73),总计有 8 组。
但是随着数字的增大,兄弟素数的分布变得越来越稀疏,寻找兄弟素数也变得越来越困难。那么会不会在超过某个界限之后就再也不存在兄弟素数了呢?
兄弟素数有无穷多对!这个猜想被称为兄弟素数猜想,至今没有被严格证明。但借助于计算机我们确实可以找到任意大数范围内的所有兄弟素数对。
输入正整数n(n<=1000000),求n以内(不含n)的所有兄弟素数对的个数。
比如,当n=100的时候,100以内的兄弟素数对的个数是8。
用一个素数筛保存每一个素数,然后从第一个素数开始,到最后一个,每个每个判断一下,两个素数是不是刚好相差为二
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int f=1,res=0;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){
res=(res<<1)+(res<<3)+(ch&15);ch=getchar();}
return res*f;
}
int vis[1000010];
int n,a[1000010],k,ans;
inline void su()//素数筛O(nlogn)
{
vis[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
a[++k]=i;
for(int j=i*2;j<=n;j+=i)vis[j]=1;
}
}
}
int main()
{
n=read();su();
for(int i=1;i<=k;i++)
{
if(a[i+1]==a[i]+2)ans++;
}
cout<<ans;
return 0;
}
玩转绝对值
数字三角变形2
第1行n,表示n行 <=25 第2到n+1行为每个的权值 程序必须经过n div 2,n div 2这个点
玄学做法,在a[n/2][n/2]加上一个很大的数,因为转移是取max,那么a[n/2][n/2]这个肯定选了,最后减去就好
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int f=1,res=0;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){
res=(res<<1)+(res<<3)+(ch&15);ch=getchar();}
return res*f;
}
int n,a[35][35],k;
long long dp[35][35],ans;
int main()
{
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
a[i][j]=read();
a[n/2][n/2]+=1e6;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];//状态转移
for(int i=1;i<=n;i++)ans=max(ans,dp[n][i]);
cout<<ans-1e6;
return 0;
}