Luogu P2426 删数 解题报告

P2426 删数

n 个不同的正整数数 x_1,x_2,x_3...x_n 排成一排,我们可以从左边或右边去掉连续的 i (1 \leq i \leq n) 个数(只能从两边删除数),剩下 n - i 个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止

每次操作都有一个操作价值,比如现在要删除从i位置到k位置上的所有的数。操作价值为|x_i - x_k| * (k - i + 1),如果只去掉一个数,操作价值为这个数的值问如何操作可以得到最大值,求操作的最大价值。

n \leq 100

READ MORE

UVA1560 Extended Lights Out 解题报告

UVA1560 Extended Lights Out

有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。

即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。

请你写一个程序,确定需要按下哪些按钮,恰好使得所有的灯都熄灭。

根据上面的规则,我们知道

  1. 第2次按下同一个按钮时,将抵消第1次按下时所产生的结果。因此,每个按钮最多只需要按下一次

  2. 各个按钮被按下的顺序对最终的结果没有影响

  3. 对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭第1行的全部灯。

如此重复下去,可以熄灭第1、2、3、4行的全部灯。同样,按下第1、2、3、4、5列的按钮,可以熄灭前5列的灯。

READ MORE

Luogu P2303 [SDOI2012] Longge 的问题 解题报告

P2303 [SDOI2012] Longge 的问题

\sum\limits_{i=1}^n \gcd(i, n)

n \leq 2 ^ {32}

解题思路:

数学题。(第一次推出式子来真的好开心hhhh)

首先看到 gcd ,第一反应应该是从 n 的因数开始思考。

那么我们把 n 质因数分解,设 d | n

我们要求的东西其实就是 \sum\limits_{d = 1}^n (d * \sum\limits_{i = 1}^n[\gcd (i,n) = j])

化简一波式子:

\begin{aligned} &\sum\limits_{d = 1}^n(d * \sum\limits_{i = 1}^n[\gcd (i,n) = j])\\ & = \sum\limits_{d = 1}^n(d * \sum\limits_{i = 1}^n[\gcd (i/j,n/j)])\\ & = \sum\limits_{d = 1}^n(d * \varphi(n/j))\\ & = \sum\limits_{d|n}(d * \varphi(n/j)) \end{aligned}

然后直接算就行了。 时间复杂度O(d(n) * \sqrt{n})

代码:

ll n,ans;

ll phi(int x) {
    if (x == 1) return 1;
    ll ans = x;
    for (int i = 2;i *i <= x;++i) {
        if (x % i == 0) {
            while (x % i == 0) {x /= i;}
            ans = (ans * (i-1) / i);
        }
    }
    if (x > 1) ans = (ans * (x-1) / x);
    return ans;
}

signed main() {
    read(n);
    for (int i = 1;i * i <= n;++i) {
        if (n % i == 0) {
            ans += i*phi(n/i);
            if (i * i != n) ans += n/i * phi(i);
        }
    }
    printf("%lld",ans);
    return 0;
}

数论入门

前言:本文主要是听了洛谷夏令营的网课后做的一些数论笔记,难度大致在提高左右,想获得最好的观看体验,建议您准备好纸笔,手动推一下公式加深印象。

READ MORE