【codeforces】Codeforces Round #641 (Div. 2)
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;
}