【题解】bistu备战天梯训练赛(一)

(题目来源于atcoder abc 156
比赛链接:https://vjudge.net/contest/405899
密码:bistuacm

A

白给题。题目读懂了按要求输出就可以了。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,cnt=0;
    cin>>a>>b;
    if(a<10)cnt+=100*(10-a);
    cout<<cnt+b<<endl;
}

B

判断 进制下的位数,最简单的方法是不断除以 ,看除几次到0即可。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,cnt=0;
    cin>>a>>b;
    while(a){
        a/=b,cnt++;
    }
    cout<<cnt;
}

C

给一个数组求方差。由于数据范围很小,所以 模拟就可以了。

#include<bits/stdc++.h>
using namespace std;
int a[11111];
int main(){
    int cnt=0,ma=0,mi=1e9;
    int n,i,j;
    cin>>n;
    for(i=0;i<n;i++)cin>>a[i];
    for(i=0;i<=100;i++){
        cnt=0;
        for(j=0;j<n;j++){
            cnt+=(a[j]-i)*(a[j]-i);
        }
        mi=min(mi,cnt);
    }
    cout<<mi;
}

D

答案显然是

可以用快速幂 求出(不会快速幂的可以自己百度一下),本题的难点在于怎么求两个组合数。
观察到 的范围都是200000,因此可以用组合数的公式来求:

分母部分可以用逆元将分数转化为整数。
这里给萌新们讲讲逆元的知识(会的大佬可以跳过了)
所谓逆元,即在模 意义下的值。设该值为 ,即 ,也就是满足 的那个
怎么求这个数呢?其实很简单。由费马小定理知,当 是素数且 互素时,
那么
也就是说, 就是 在模 意义下的逆元了。
要求 ,相当于求 乘以 的逆元。逆元的知识很重要,可以把分数当成整数进行各种运算。
所以分母部分直接乘以每个数的逆元就等价于除以这个数了。

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int mod=1e9+7;
ll power(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1)res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;
}
ll inv(ll x){
    return power(x,mod-2);
}
ll C(ll n,ll k){
    ll res=1;
    for(ll i=1;i<=k;i++){
        res=res*(n-i+1)%mod*inv(i)%mod;
    }
    return res%mod;
}
int main(){
    int cnt=0,ma=0,mi=1e9;
    ll n,a,b;
    cin>>n>>a>>b;
    cout<<(power(2,n)-1-C(n,a)-C(n,b)+mod*1LL*1000)%mod;
}

E

首先不妨设人数为“0”的房间个数为 方案数为
那么最终的答案显然是。因为操作 次一定能形成人数为“0”的房间个数不大于 的局面,且大于 的局面一定不能形成。

可以这样来求:首先 个“0”房间的分布一共有 种,剩下的则是至少数量为1的房间,根据整数划分的结论,将 拆分成个正整数,共有 种。
所以最终的答案是
本题由于一共要求 个组合数,因此不能用上题的组合数求法。
正确的方法是利用递推:
观察。利用这个递推即可根据 求出所有的
求出所有的 后,全部加起来就是最终的结果了。

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int mod=1e9+7;
ll power(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1)res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;
}
ll inv(ll x){
    return power(x,mod-2);
}
ll C(ll n,ll k){
    ll res=1;
    for(ll i=1;i<=k;i++){
        res=res*(n-i+1)%mod*inv(i)%mod;
    }
    return res%mod;
}
ll dp[200020],sum[200020];
int main(){
    int cnt=0,ma=0,mi=1e9;
    ll n,k,i;
    cin>>n>>k;
    dp[0]=1;
    dp[1]=n*(n-1)%mod;
    k=min(k,n);
    for(i=2;i<=n;i++){
        dp[i]=dp[i-1]*(n-i+1)%mod*inv(i)%mod*(n-i)%mod*inv(i)%mod;
    }
    sum[0]=dp[0];
    for(i=1;i<=k;i++){
        sum[i]=(sum[i-1]+dp[i])%mod;
        //cout<<dp[i]<<" "<<sum[i]<<endl;
    }

    cout<<sum[k];
}

F

// TODO
暂时不会做,等以后会了再补

全部评论

相关推荐

头像
10-22 20:13
中南大学 Java
序言大家好呀。我是希晨er,一个初入职场的程序猿小登最近上班摸鱼刷到了一篇文章:10年深漂,放弃高薪,回长沙一年有感,还有聊聊30岁大龄程序员过往的心路历程,突然就有点感慨。我如今也做出了和大明哥一样的抉择,只是更早。此外我22年的人生,好像从来没好好记录过。正好现在工作不太忙,就想把这些经历写下来,也希望能得到社区里各位前辈的指点个人背景我是03年出生的西安娃,父母都是普通打工人。刚从中南大学软件工程专业毕业半年,现在在老家的央企过着躺平摆烂的日子成长轨迹从农村到城市的童年我家并不是西安的,只是爸妈在西安上班,从小学之后就把我接到了西安。后来老家房子拆了,爷爷奶奶也搬了过来。农村的生活,我觉...
Yki_:看哭了,恋爱那一段你女朋友说你不够关心她,可你毕竟也愿意遇到矛盾写几千字来和她慢慢分析;说不愿意给她花钱,我感觉可能只是消费观不一样;如果她想留在长沙,也应该提前跟你说开。不过她也许会心疼你放弃大厂offer转向数字马力?我也因为同样的原因有过一段幸福而充满遗憾的感情,不过跟爱情相比确实前途更重要一点。至于offer的选择,换我我也会这么选。把这些旧事记录下来以后,接下来就好好向前看吧,加油兄弟
🍊晨光随笔
点赞 评论 收藏
分享
10-20 15:26
门头沟学院 Java
桥头牛油火锅:这个比例不正常,简历的话项目经历放中间,项目功能分点可以再明确点,前面加“·”或者“1 2 3”,另外简历上的照片可以去外面摄影店拍一下,以后也会用到的,hr筛人也是多少会看的,毕竟世界是一个巨大的卡颜局嘛,还有有些hr由于消息太多可能没看到,后面可能会回来找你,要简历的还会多一点,我也是普2本,比例大致是600:90:15:3,当然我实力不太够,拿的offer比较少,慢慢来吧
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务