101.RSA解密
102.数的分解
预处理+01背包求方案数
#include<bits/stdc++.h>
using namespace std;
const int N = 2030;
int p[N],cnt;
long long f[N][5];
bool check(int n)
{
while(n)
{
if(n%10==2||n%10==4) return false;
n/=10;
}
return true;
}
int main()
{
for(int i=1;i<2019;i++) if(check(i)) p[cnt++]=i;
f[0][0]=1;
for(int i=0;i<cnt;i++)
for(int j=2019;j>=p[i];j--)
for(int k=1;k<=3;k++) f[j][k]+=f[j-p[i]][k-1];
cout<<f[2019][3];
return 0;
}
答案:40875
103.求和
模拟
#include<bits/stdc++.h>
using namespace std;
long long res;
bool check(int n)
{
while(n)
{
if(n%10==2||n%10==0||n%10==1||n%10==9) return true;
n/=10;
}
return false;
}
int main()
{
for(int i=1;i<=2019;i++) if(check(i)) res+=i;
cout<<res;
return 0;
}
答案:1905111
104.矩形切割
模拟
#include<bits/stdc++.h>
using namespace std;
int res;
int main()
{
//int a=5,b=3;
int a=2019,b=324;
while(a&&b)
{
if(a<b) swap(a,b);
res+=a/b;
a-=a/b*b;
}
cout<<res;
return 0;
}
答案:21
105.质数
判质数/筛质数
#include<bits/stdc++.h>
using namespace std;
int cnt;
bool isp(int n)
{
if(n<2) return false;
for(int i=2;i<=n/i;i++) if(n%i==0) return false;
return true;
}
int main()
{
for(int i=1;i<=100000;i++)
if(isp(i))
{
cnt++;
if(cnt==2019)
{
cout<<i;
break;
}
}
return 0;
}
答案:17569
106.立方和
模拟(注意long long)
#include<bits/stdc++.h>
using namespace std;
long long res;
bool check(int n)
{
while(n)
{
if(n%10==2||n%10==0||n%10==1||n%10==9) return true;
n/=10;
}
return false;
}
int main()
{
for(int i=1;i<=2019;i++) if(check(i)) res+=1ll*i*i*i;
cout<<res;
return 0;
}
答案:4097482414389
107.字串数字
秦九韶
#include<bits/stdc++.h>
using namespace std;
long long res;
int main()
{
string s="LANQIAO";
for(int i=0;s[i];i++) res=res*26+(s[i]-'A'+1);
cout<<res;
return 0;
}
答案:3725573269
108.不同子串
模拟
#include<bits/stdc++.h>
using namespace std;
set<string> st;
int main()
{
//string s="aaab";
string s="0100110001010001";
for(int i=0;s[i];i++)
for(int j=i;s[j];j++)
{
string ss;
for(int k=i;k<=j;k++) ss+=s[k];
st.insert(ss);
}
cout<<st.size();
return 0;
}
答案:100
109.分数
模拟
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int n=524288,sum=0;
for(int i=1;i<=20;i++) sum+=n,n/=2;
int d=gcd(sum,524288);
cout<<sum/d<<'/'<<524288/d;
return 0;
}
答案:1048575/524288
110.星期一