https://www.lanqiao.cn/oj-contest/newbie-24/
1. 分配辣条
签到题。
#include <iostream> using namespace std; int main() { cout<<20250601/305*305; return 0; }
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; }
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; }
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; }
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; }