蓝桥 小白入门赛24

https://www.lanqiao.cn/oj-contest/newbie-24/

1. 分配辣条

签到题。

#include <iostream>
using namespace std;
int main()
{
  cout<<20250601/305*305;
  return 0;
}
View Code

2. 决出国特

题意为求出最小的不能被前n个质数整除的数。根据埃氏筛的思想,前n个质数会将第n个质数~答案之间的所有合数筛掉,所以答案即为第n+1个质数。

#include <iostream>
using namespace std;
const int N =1e7+10,M=1e6+10;
bool vis[N];
int primes[M],k=0;
int main()
{
  int n;
  cin>>n;
  for(int i=2;i<=N;i++)
  {
      if(vis[i]==0)
      {
          primes[k++]=i;
          for(int j=2;i*j<=N;j++)
              vis[i*j]=1;
      }
  }
  cout<<primes[n];
  return 0;
}
View Code

3. 录入成绩

因为国特G只能有一个,可以枚举国特的位置,复杂度为O(N^2),其余的G默认和后面的字符配对,如果不能配对则表示此方案不合法。

#include <iostream>
#include <map>
#include <string>
using namespace std;
int check(string& s,int idx,int len){
  map<string,int> snt;
  for(int i=0;i<len;i++){
    if(i==idx) continue;
    if(s[i]=='G'&&(i==len-1||(i+1==idx))) return -1;//此方案不合法
    else if(s[i]=='G'){
      snt[s.substr(i,2)]++;
      i++;
    }
    else{
      snt[to_string(s[i])]++;
    }
  }
  if(snt.size()==7) return snt["G1"];
  else return -1;
}
int main()
{
  string s;
  cin>>s;
  int len=s.size();
  int res=0;
  for(int i=0;i<s.size();i++){
    if(s[i]=='G')
      res=max(res,check(s,i,len));
  }
  cout<<res;
  return 0;
}
View Code

4. 标记名字

题意为求1~n-1中和n没有约数的数的个数,即为求n的欧拉函数,phi(n)=n*(1-1/p1)*(1-1/p2)...

#include<iostream>
#include<map>
using namespace std;
typedef long long LL;
int main(){
  LL n;
  cin>>n;
  LL res=n;
  for(int i=2;i*i<=n;i++){
    if(n%i==0){
      res=res/i*(i-1);//避免小数
      while(n%i==0) n/=i;
    }
  }
  if(n>1) res=res/n*(n-1);
  cout<<res<<endl;
  return 0;
}
View Code

 5. 奖杯排列

#include <iostream>
#include <map>
using namespace std;
const int N = 2e5+10;
const int mod = 1e9+7;
int q[N];
int main()
{
  //dp[i]表示以i结尾的方案数
  int n,k;
  cin>>n>>k;
  for(int i=0;i<n;i++){
    cin>>q[i];
  }
  map<int,int> f;
  //f[i]表示以i结尾的公差为k的序列数目
  int res=0;
  for(int i=0;i<n;i++){
    res=(res+f[q[i]-k])%mod;
    //针对每一个数,加上以它结尾的合法序列的数目
    f[q[i]]=(f[q[i]]+f[q[i]-k]+1)%mod;
    //更新,第一种情况是下一个q[i]+k和q[i]-k,q[i]一起,就有f[q[i]-k]种方案
    //其次,如果舍去q[i]-k及其之前的,只用q[i],这就是+1的原因
  }
  cout<<res;
  return 0;
}
View Code

 

posted on 2024-12-15 12:52  greenofyu  阅读(2)  评论(0编辑  收藏  举报