Always keep a be|

devoteeing

园龄:8个月粉丝:2关注:5

蓝桥杯 第 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需要满足的条件:

  1. A%(B*N-C)!=0;
  2. 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 中国大陆许可协议进行许可。

posted @   devoteeing  阅读(40)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起