zoukankan      html  css  js  c++  java
  • LightOJ

    题目大意:求(1^K + 2^K + 3K + … + N^K) % 2^32

    解题思路:
    借用别人的图
    这里写图片描写叙述
    这里写图片描写叙述
    能够先打表,求出Cnm,用杨辉三角能够高速得到

    #include<cstdio>
    typedef unsigned long long ll;
    const int N = 55;
    const ll mod = (1LL << 32);
    struct Matrix{
        ll mat[N][N];
    }A, B, tmp;
    
    ll n, num[N];
    ll C[N][N];
    int K;
    
    void init2() {
        C[0][0] = 1;
        for(int i = 1; i <= 50; i++) {
            C[i][i] = C[i][0] = 1;
            for(int j = 1; j < i; j++)
                C[i][j] = (C[i-1][j-1] + C[i-1][j]) % mod;
        }
    }
    
    Matrix matMul(const Matrix &x, const Matrix &y) {
        for(int i = 0; i < K + 2; i++)
            for(int j = 0; j < K + 2; j++) {
                tmp.mat[i][j] = 0;
                for(int k = 0; k < K + 2; k++) {
                    tmp.mat[i][j] = (tmp.mat[i][j] + x.mat[i][k] * y.mat[k][j]) % mod;
                }
            }
        return tmp;
    }
    void solve() {
        while(n) {
            if(n & 1)
                B = matMul(B,A);
            A = matMul(A,A);
            n >>= 1;
        }
    }
    
    void init() {
        for(int i = 0; i < K + 2; i++) 
            for(int j = 0; j < K + 2; j++) {
                B.mat[i][j] = A.mat[i][j] = 0;
                if(i == j)
                    B.mat[i][j] = 1;
            }
    
        A.mat[0][0] = 1;
        for(int i = 1; i < K + 2; i++) 
            A.mat[i][0] = A.mat[i][1] = C[K][i-1];
        for(int i = 2; i < K + 2; i++)
            for(int j = i; j < K + 2; j++) {
                A.mat[j][i] = C[K-i+1][j-i];
            }
    }
    
    int main() {
        int test, cas = 1;
        scanf("%d", &test);
        init2();
        while(test--) {
            scanf("%lld%d", &n, &K);
            printf("Case %d: ", cas++);
            ll ans = ( (n % mod) * ( (n + 1) % mod) / 2) % mod;
            if(K == 1) {
                printf("%lld
    ", ans);
                continue;
            }
            init();
    
            n--;
            solve();
            ans = 0;
            for(int i = 0; i < K + 2; i++)
                ans = (ans + B.mat[i][0] ) % mod;
            printf("%lld
    ", ans);
        }
        return 0;
    }
    
  • 相关阅读:
    HTML5小游戏-绵羊快跑
    JavaScript模拟下拉菜单代码
    作业6
    作业5
    作业4
    作业三
    作业2(第二遍)
    sap jco3安装
    jmeter脚本文件(jmx)关联
    正则替换:删除空行、格式化Json/xml
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7204708.html
Copyright © 2011-2022 走看看