2023
思路:首先先用to_string把数字变成字符串(ps:在Dev c++里用不了),用数组dp,用dp【0】记录2的数量,dp【1】记录20的数量,dp【2】记录202的数量,dp【3】记录2023的数量,遍历一边字符串就可以得到答案
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
long long dp[10];
int main()
{
string s;
for (int i = 1; i < 2024; i++)
{
s+= to_string(i);
}
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '2') dp[0]++, dp[2] += dp[1];
if (s[i] == '0') dp[1] += dp[0];
if (s[i] == '3') dp[3] += dp[2];
}
cout << dp[3];
return 0;
}
双子数
思路:首先先筛素数,根号23333333333333小于10的7次方,直接用1e7筛数就行,然后就是乘法,记住一定要用下面这个,long long 也扛不住
#define int __int128
#include <iostream>
#include <cmath>
#define int __int128
using namespace std;
long long prime[10000010];
int q[10000010];
long long ans;
signed main()
{
long long res=0;
for(int i=2;i<=10000000;i++)
{
if(!q[i]) prime[ans++]=i;
for(int j=0;prime[j]*i<=10000000;j++)
{
q[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
long long l1=2333,r1=23333333333333;
for(int i=0;i<ans;i++)
{
if(prime[i]*prime[i]*prime[i+1]>r1/prime[i+1]) break;
for(int j=i+1;j<ans;j++)
{
int l=prime[i],r=prime[j];
if(l*l*r*r<l1) continue;
if(l*l*r*r>r1) break;
res++;
}
}
cout<<res;
return 0;
}