Warning: session_start(): open(/tmp/sess_a0f7c5afe4d83ccd78956e1f87cc64a3, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:manespace:codeforces_642_div2 [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:manespace:codeforces_642_div2

啊,这周又是一堆的作业,只打了一场比赛,没想到遇到了国人的数论专场,m(m(m(m(打着打着就不会了,😔

  • A

    • 题意:给一个数$n$ ,进行$k$次运算 运算规则,得到$n$除了1之外能够整除$n$的最小数字,然后将结果$f(n)$加到$n$上,在经过k次运算,得到最终结果

    • 思路:将$n$分为偶数和奇数两部分,如果$n$为偶数,$f(n)$2,$n+f(n)$也是偶数,之后的迭代就直接加$2$就行了,如果$n$为奇数,有两种情况,第一,他为质数,第二,他的$f(n)$为质数,但是无论如何,他在一次迭代后得到的数都是偶数,然后再用一的情况就行了。

    • 代码:

    #include <bits/stdc++.h>
    using namespace std;
    int sdiv(int n){
        for(int i = 2; i <= sqrt(n); i++){
            if(n % i == 0) return i;
        }
        return n;
    }
    int main(){ 
        int n;
        scanf("%d",&n);
        while(n--){
            int k, t;
            scanf("%d%d",&k,&t);
            if(sdiv(k) % 2 == 1){
                k += sdiv(k);
                k += (t-1)*2;
            }
            else 
            {
                k += t *2;
            }
            printf("%d\n",k);
        }
        return 0;
    }
  • B

    • 题意:给你一串数$s$$1$,$s$$2$,$s$$3$,$\ldots$,$s$$n$. 如果满足下标$i$$j$,$i$$j+1$满足$i$$j$<$i$$j+1$并且有$s$$i$$j$ <$s$$i$$j+1$ .则称这样的安排是美的,题目要你找出一串序列中最长的,具有美感的数列长度。

    • 题解:不多bb

    • 代码:

    •   # include <bits/stdc++.h>
       
        using namespace std;
       
        void solve() {
            int n;
            cin >> n;
            vector <int> a(n + 1), dp(n + 1);
            for (int i = 1; i <= n; i++) {
                cin >> a[i];
            }
            int answer = 0;
            for (int i = 1; i <= n; i++) {
                int mx = 0;
                for (int j = 1; j * j <= i; j++) {
                    if (i % j == 0) {
                        if (a[j] < a[i]) mx = max(mx, dp[j]);
                        if (a[i / j] < a[i]) mx = max(mx, dp[i / j]);
                    }
                }
                dp[i] = mx + 1;
                answer = max(answer, dp[i]);
            }
            cout << answer << endl;
        }
       
        int main() {
            int tt = 1;
            cin >> tt;
            while (tt--)
                solve();
        }
  • C

    • 题意:给你一串数$s$$1$,$s$$2$,$s$$3$,$\ldots$,$s$$n$. 先算这串数的lcm,再算这串数的 gcd。

    • 题解:开始没仔细思考就直接暴力,直接按题意来算,提交后就后悔了,暴力肯定会超时的啊,后来想到了STL大法,果然还是很强。

    • 代码:

    #include <bits/stdc++.h>
     
    using namespace std;
     
    int main() {
      int n;
      cin >> n;
      vector<int> a(n);
      for (int i = 0; i < n; i++) {
        cin >> a[i];
      }
      vector<int> pre(n + 1);
      for (int i = 0; i < n; i++) {
        pre[i + 1] = __gcd(pre[i], a[i]);
      }
      vector<int> suf(n + 1);
      for (int i = n - 1; i >= 0; i--) {
        suf[i] = __gcd(suf[i + 1], a[i]);
      }
      long long ans = 1;
      for (int i = 0; i < n; i++) {
        int x = __gcd(pre[i], suf[i + 1]);
        ans = ans / __gcd(ans, (long long) x) * x;
      }
      cout << ans << '\n';
      return 0;
    }
  • D

  • E

  • F

淦,从markdown转码过来就是这样的了,全<html>的了,懒得改了

2020-2021/teams/manespace/codeforces_642_div2.1589535038.txt.gz · 最后更改: 2020/05/15 17:30 由 quantumbolt