安徽大学2019 ACM实验室公开赛 部分题解

URL:https://ac.nowcoder.com/acm/contest/2720

A.素数分布

https://ac.nowcoder.com/acm/contest/2720/A

打个线性筛表,直接求和输出即可。

AC代码:

#include <iostream>
#include <cstring>
using namespace std;
const int N = 100005;
int num[N], prim[N];
int pn = 0;
void table(){
    memset(num, -1, sizeof(num));
    for(int i = 2;i < N;i++){
        if(num[i]) prim[pn++] = i;
        for(int j = 0;j < pn && 1LL*i*prim[j] < N;j++){
            num[i*prim[j]] = 0;
            if(i % prim[j] == 0) break;
        }
    }
}


int main() {
    int T;
    cin >> T;
    int n;
    table();
    while(T--) {
        cin >> n;
        int ans = 0;
        for(int i = 2;i<=n;i++) if(num[i]) ans++;
        cout << ans << endl;
    }


    return 0;
}

B.食物分配

先将食物从小到大排序,判定条件为是否存在两份小的食物之和等于稍大的两份食物,即可。

AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100005;
int T;
int A[4];
int main() {
    cin >> T;
    while(T--) {
        for(int i = 0; i < 4; i++) cin >> A[i];
        sort(A,A+4);
        int ans1 = A[0] + A[1];
        if(A[0] + A[1] == A[2] && A[2] == A[3]) {
            cout << A[3] << endl;
        }else {
            cout << -1<<endl;
        }
    }
    return 0;
}

 

C.AHUICPC(easy version)

数据范围很小,只需要在n==10的时候多加一个A即可。

#include <iostream>
using namespace std;
int n;
int main() {
    cin >> n;
    if(n<10) {
        cout <<"AHU";
        while(n--) cout << "I";
        cout << "CPC" <<endl;
    }
    else {
        cout << "AAHUIIIIICPC"<<endl;
    }

    return 0;
}

 

D.不定方程

实际上是求两者最小公倍数LCM的相关系数,并且可以知道,a和b必然是互质的,否则即不存在。而若两者互质,交换二者即可。

AC代码

#include<iostream>
using namespace std;
typedef long long LL ;
LL gcd(LL a,LL b)
{
    return b ? gcd(b,a%b):a;
}
int main()
{
    int n;
    cin >> n;
    while(n-- ) {
        LL a, b;
        cin >> a >> b;
        LL gcd1 = gcd(a,b);
        LL lcm1 =  a* b / gcd1;
        if(gcd(a,b)!=1) cout << -1 << endl;
        else cout << lcm1/a << " " << lcm1/b << " " << lcm1 << endl;
    }
    return 0;
}

 

F.蕊蕊上学

概率分布,在a时间段内上车的概率为(a/a+b),b时间段内为(b/a+b),数学期望即为(a^2+b^2)/(a+b)

AC代码

#include<iostream>
using namespace std;
double a, b;
int main() {
    cin >> a >> b;
    double c = (a*a + b*b) / (a+b);
    printf("%.2lf\n",c);
    
    return 0;
}

 

H.无尽大军

这题要用到唯一分解定理,将问题抽象为从1开始,要么耗费2点翻倍, 要么耗费1点实现上一个愿望。即

\Sigma a_i = n 即n的质因数分解。

AC代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n;
int main() {
    cin >> n;
    ll num = 0;
    for(ll i = 2; i*i <= n; i++) {
        while(n % i == 0) {
            num += i;
            n /= i;
        }
    }
    if(n!=1) num += n;
    cout << num << endl;
    return 0;
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值