子 2023
设dp0为以2开头的子序列,同理,dp1为以20开的子序列,dp2为以202开头的子序列,dp3为202的序列,那么我们就可以用动态规划的思想将这道题做出来
#include<iostream>
using namespace std;
long long dp[4],len;
string s;
int main(){
for(int i=1;i<=2023;i++)s+=to_string(i);
len=s.size();
for(int i=0;i<len;i++){
if(s[i]=='2')dp[0]++,dp[2]+=dp[1];
else if(s[i]=='0')dp[1]+=dp[0];
else if(s[i]=='3')dp[3]+=dp[2];
}
cout<<dp[3];
return 0;
}
双子数
答案为947293。
#include<iostream>
#include<cmath>
using namespace std;
const int N=5e6+10;
int primes[N];
bool st[N];
int cnt;
void get_primes(int n) // 线性筛质数
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0;j<cnt&&primes[j] <= n / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
int main(){
get_primes(N);
int ans=0;
for(int i=0;i<cnt;i++){
if(1ll*primes[i]*primes[i]*primes[i]*primes[i]>23333333333333) break;//注意数据范围会爆int
for(int j=i+1;j<cnt;j++){
if(1ll*primes[i]*primes[i]*primes[j]*primes[j]<2333)continue;
if(1ll*primes[i]*primes[i]*primes[j]*primes[j]>23333333333333)break;
ans++;
}
}
cout<<ans;
return 0;
}