【codeforces】Codeforces Round #641 (Div. 2)

套题传送门

A. Orac and Factors

B. Orac and Models

C. Orac and LCM

AC代码


A. Orac and Factors

【数学】\(f(n)\)返回\(n\)的最小非1因数,求经过\(k\)\(f(n) +n\)后的结果。

\(n\)为偶数时,其最小非1因数为2,\(n+2\)仍然为偶数,所以此时\(n + 2 × {剩下的次数}\)

\(n\)为奇数时,找其最小非1因数。

B. Orac and Models

【dp】下标\(i\)是下标\(j\)的因数且\(s_i < s_j\)可以\(beatiful\)数组

dp[]表示当前\(beatiful\)数组元素最大的数量;

找因数:\(i\)\(n\)开始,进行埃氏筛法找\(i\)的因数\(j\),推导式如下

  • \(dp[i / j] = max(dp[i / j], dp[i] + 1)\)
  • \(dp[j] = max(dp[j], dp[i] + 1)\)

C. Orac and LCM

【数学】推导式太强了...

https://www.cnblogs.com/lilibuxiangtle/p/12879584.html


AC代码

A

//
#include<iostream>
#include<cstdio>
using namespace std;

typedef long long LL;
int T;
LL n, k;

LL solve(LL n){
    LL i;
    bool flag = false;
    for(i = 2; i * i <= n; i++){
        if(n % i == 0) { flag = true; break;}
    }
    if(flag) return n + i;
    else return n + n;
}

int main()
{
    scanf("%d", &T);
    while(T--){
        scanf("%I64d %I64d", &n, &k);
        for(int i = 0; i < k; i++){
            if(n % 2 != 0)
                n = solve(n);
            else{
                n += (k - i) * 2;
                break;
            }
        }
        printf("%I64d\n", n);
    }
    return 0;
}

B

//
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int T, n;
int num[100005], dp[100005];

int main()
{
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) {
            dp[i] = 1;
            scanf("%d", &num[i]);
        }

        if(n == 1) { printf("1\n"); continue; }

        for(int i = n; i > 1; i--){
            if(num[i] > num[1])
                dp[1] = max(dp[1], dp[i] + 1);
            for(int j = 2; j * j <= i; j++){
                if(i % j == 0){
                    if(num[i] > num[i / j])
                        dp[i / j] = max(dp[i / j], dp[i] + 1);
                    if(num[i] > num[j])
                        dp[j] = max(dp[j], dp[i] + 1);
                }
            }
        }
        int ans = 0;
        for(int i = 1; i <= n; i++){
//            printf("i:%d dp:%d\n", i, dp[i]);
            if(dp[i] > ans) ans = dp[i];
        }
        printf("%d\n", ans);
    }

    return 0;
}

C

//https://www.cnblogs.com/lilibuxiangtle/p/12879584.html
#include<iostream>
#include<cstdio>
using namespace std;

typedef long long LL;
int n;
LL a[100005], l[100005];

LL gcd(LL a, LL b){
    if(b == 0) return a;
    return gcd(b, a % b);
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%I64d", &a[i]);

    l[n] = a[n];
    for(int i = n - 1; i >= 1; i--)
        l[i] = gcd(l[i + 1], a[i]);

    LL ans = a[1] * l[2] / gcd(a[1], l[2]);
    for(int i = 2; i <= n; i++){
        ans = gcd(ans, a[i] * l[i + 1] / gcd(a[i], l[i + 1]));
    }
    printf("%I64d\n", ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Ayanowww/p/12894135.html