蓝桥杯 第 24 场 强者挑战赛 题解上(1-3题)
-
标记名字【算法赛】
一条横幅,在1/N,2/N, 3/N···(N-1)/N的地方标记一次,若之前标记过这则不用再标记,求f(N)=此时新标记的个数。
-
上思路
读懂题后,重点在于确定该题的思考方向,也就是,新标记的点分子和分母有什么特点。
于是乎,比如N=6时, 1/6, 2/6, 3/6, 4/6, 5/6中,就明白f(N)=这些分数中不可约分的个数(官方一点,1-N中与N互质的个数)。如4/6=2/3,这条线必然以2/3的形式先出现过。
标准的欧拉函数!
#include <bits/stdc++.h> #define int long long using namespace std; const int xmax=1e6; int euler_phi(int n) { int ans = n; for (int i = 2; i*i <= n; i++) if (n % i == 0) { ans = ans / i * (i - 1); while (n % i == 0) n /= i; } if (n > 1) ans = ans / n * (n - 1); return ans; } void solve(){ int n;cin>>n; int m=euler_phi(n); cout<<m<<'\n'; } signed main() { int T;T=1; while(T--){ solve(); } return 0; }
-
奖杯排列【算法赛】
组委会准备了N 个大小不同的奖杯,每个奖杯上都刻着一个数字 ai,代表奖杯的价值。组委需要从这 N 个奖杯中选出一些奖杯,使得这些奖杯的价值,按照它们在原序列中的顺序排列,能够组成一个长度大于 1、公差为 K 的等差数列。
结果对1e9+7取模。
-
上思路
一个动态规划,只需记录之前以(ai-k)结尾的数列个数。
用map记录,喜欢map。
#include <bits/stdc++.h> #define int long long using namespace std; const int xmmm=2e5+10; const int mod=1e9+7; signed main() { int n, k;cin>>n>>k; map<int, int>p1; int ans=0; for(int i=1;i<=n;i++){ int t;cin>>t; if(t-k>=1&&p1[t-k]){ ans+=p1[t-k]; ans%=mod; p1[t]=(p1[t]+p1[t-k])%mod; } p1[t]++;//表示以t作为等差数列的第一个元素,因为长度为1,所以不计入ans中。 } cout<<ans%mod<<'\n'; return 0; }
-
估算分数【算法赛】
满足⌊F(N)⌋<F(N)<∣F(N)∣, 则这个N合格。
求N的个数。
-
上思路
N需要满足的条件:
- A%(B*N-C)!=0;
- B*N<C
#include <bits/stdc++.h> #define int long long using namespace std; const int xmmm=2e5+10; int a, b, c; int mm(int x){//若存在N,使x==c-b*N&&c>b*N, 则return 1, 表示ans需要-1;反之则不需要。 if((c-x)%b==0&&c-x>0)return 1; else return 0; } signed main() { cin>>a>>b>>c; if(b>=c){ cout<<0<<'\n'; return 0; } int m=c%b==0?c/b-1:c/b; int ans=m;//初始化ans为m for(int i=1;i<=sqrt(a);i++){ if(a%i==0){ ans-=mm(i); if(i*i!=a)ans-=mm(a/i); } } cout<<ans<<'\n'; return 0; }
本文作者:成长宝地
本文链接:https://www.cnblogs.com/1747176348mi/p/18631453
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步