文章目录
纯质数(筛法的应用)
筛法筛一遍筛出所有质数然后挨个判断就可以了
#include <iostream>
#include <vector>
using namespace std;
const int N=20210610;
int st[N];
vector<int>prime;
void isprime() {
for(int i=2;i<=20210605;i++) {
if(!st[i]) prime.push_back(i);
for(int j=0;j<prime.size()&&i*prime[j]<=20210605;j++) {
st[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
isprime();
int ans=0;
for(int i=0;i<prime.size();i++) {
int cnt=prime[i],flag=1;
while(cnt&&flag) {
int te=cnt%10;
if(!(te==2||te==3||te==5||te==7)) flag=0;;
cnt/=10;
}
if(flag) ans++;
}
cout<<ans<<endl;
return 0;
}
最少砝码
先上结论:对以3为公比的等比数列求和
首先我们可以很明显的发现一件事:1是一定要有的。
然后我们要思考一件事:如何通过新增一个砝码来达到表示出更多数字的目的。当前能表示出的最大数字是1,所以下一个砝码应当是n-1=2(2是下一个还没有表示出的数字)所以可得n=3。继续按同样的方法分析,n-4=5(4是能表示出的最大数字)…
所以可得n-能表示出的最大数字=不能表示出的最小数字
(啰啰嗦嗦就是为了这个)
然后移项一下就发现这就是等比数列求和
#include <iostream>
using namespace std;
int main()
{
int n,ans=1,cnt=1,sum=1;
cin>>n;
while(sum<n) {
++ans;
cnt*=3;
sum+=cnt; //sum就是当前能表示出的最大质量
}
cout<<ans<<endl;
return 0;
}
灌溉
直接暴力从每一个点作为起点bfs一遍就可以了。然后再想一下第几分钟能被灌溉到的点到源头的欧拉距离就是几
#include <iostream>
#include <vector>
using namespace std;
const int N=110;
int tu[N][N];
vector<pair<int,int>>res;
int n,m,t,a,b,ans,st;
int main()
{
cin>>n>>m>>t;
for(int i=0;i<t;i++) {
cin>>a>>b;
res.push_back({a,b});
}
cin>>st;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
int flag=0;
for(int k=0;k<t&&!flag;k++) {
int len=abs(res[k].first-i)+abs(res[k].second-j);
if(len<=st) flag=1;
}
if(flag) ans++;
}
}
cout<<ans<<endl;
return 0;
}