codeforces / project Euler 泛做

发现这个题库,很有意思,趁着还没有学习微积分,看不了书,赶快从头开始刷,所以都是一些简单的题目,即时简单,有一些结论还是很有意思的。
网上资料很少,有的找不到答案,所以只有硬着头皮做了。

PE 15

一个网格图,只能向下,或者向右走,问从\((0,0)\)\((n,m)\)到路径有多少条.
这里的结论是有\(C_{n+m}^n\).
证明:从0,0到n,m会往下走n步,往右走m步,把路径看成一个长度为n+m的序列,往下走为0,往右走为1
有n个0,m个1,转化为有多少个不同的序列。
我们考虑从序列中选择0的方案数.就是\(C_{n+m}^n\).

PE 76

这是一道很有意思的Partition Function P题目。
里面详细的讲解了如何使用数学的方法来解,不过全是英文,我没有看懂。
也可以使用\(f[i][j]\)表示以i结尾最后一段的和式j数的方案数.
然后发现可以使用前缀和优化,复杂度\(O(n^2)\)
由于是DP,所以放一下代码仅供参考.

int main() {
    f[0][0] = sum[0][0] = 1;
    for(int i = 1;i <= 100;++ i) sum[0][i] = sum[0][i - 1];
    int n = 100;
    for(int i = 1;i <= n;++ i) {
        for(int j = 1;j <= i;++ j) {
            f[i][j] = sum[i - j][j];
            sum[i][j] = f[i][j];
        }
        for(int j = 2;j <= 100;++ j) sum[i][j] += sum[i][j - 1];
    }
    ll Ans = 0;
    Ans = sum[100][99];
    std::cout << Ans;
    return 0;
}

从上面的链接中得知,有生成函数的解法。

PE 90

一个trick , 显然可以用对数函数来比较大小
\(log(a^b) = b*log(a)\)

PE 577

恩,调这道题做了一下午。
\(f(i)\)表示以i行为底的六边形造成的共线,然后就可以计算了
\[f(n) = f(n-1) + \sum_{s=1}^{\lfloor n/3\rfloor}s(n-3s+1)\]

PE 97

一个trick , mod,
乘法和加法满足
\((a*b) \% mod = ((a \% mod) * (b \% mod))\%mod\)
\((a+b)\%mod = ((a\% mod) + (b\% mod) )\%mod\)

待做

PE 601
PE 613
PE 493
PE 102
PE 618

猜你喜欢

转载自www.cnblogs.com/gaozhuoyuan/p/10492334.html