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

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

A.素数分布

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

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

AC代码:

#include 
#include 
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 
#include 
#include 
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<

 

C.AHUICPC(easy version)

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

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

 

D.不定方程

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

AC代码

#include
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
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 
#include 
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;
}

 

你可能感兴趣的:(比赛题解)