兄弟素数
いわゆる兄弟の素数は、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です。
素数ふるいを使用して各素数を保存し、最初の素数から最後の素数まで開始し、それぞれが2つの素数が正確に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 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
最初の行nは、n行<= 25を意味し、各ウェイトプログラムの2番目からn + 1行は、ポイントn div 2、n div2を通過する必要があります。
形而上学的な練習では、転送が最大になるため、a [n / 2] [n / 2]に大きな数値を追加します。次に、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;
}