【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);
    }
    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
"); 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
", i, dp[i]);
            if(dp[i] > ans) ans = dp[i];
        }
        printf("%d
", 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
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Ayanowww/p/12894135.html