zoukankan      html  css  js  c++  java
  • 模板

    矩阵行列式

    #include<iostream>
    #include<cstdio>
    #include<cmath>
     
    using namespace std;
     
    typedef __int64 lld;
     
    lld a[205][205];
     
    int sign;
    lld N,MOD;
    void solved()
    {
        lld ans=1;
        for(int i=0;i<N;i++)//当前行
        {
            for(int j=i+1;j<N;j++)//当前之后的每一行,因为每一行的当前第一个数要转化成0(想想线性代数中行列式的计算)
            {
                int x=i,y=j;
                while(a[y][i])//利用gcd的方法,不停地进行辗转相除
                {
                    lld t=a[x][i]/a[y][i];
     
                    for(int k=i;k<N;k++)
                        a[x][k]=(a[x][k]-a[y][k]*t)%MOD;
     
                    swap(x,y);
                }
                if(x!=i)//奇数次交换,则D=-D'整行交换
                {
                    for(int k=0;k<N;k++)
                        swap(a[i][k],a[x][k]);
                    sign^=1;
                }
            }
            if(a[i][i]==0)//斜对角中有一个0,则结果为0
            {
                cout<<0<<endl;
                return ;
            }
     
            else
                ans=ans*a[i][i]%MOD;
     
        }
     
        if(sign!=0)
            ans*=-1;
        if(ans<0)
            ans+=MOD;
        printf("%I64d
    ",ans);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
     
        while(t--)
        {
            sign=0;
            scanf("%I64d%I64d",&N,&MOD);
            for(int i=0;i<N;i++)
                for(int j=0;j<N;j++)
                    scanf("%I64d",&a[i][j]);
            solved();
        }
        return 0;
    }
    

    高精度模板

    __int128

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 81 ; 
    void input(__int128 &s)
    {
    	s = 0 ;
    	char c= ' ' ;
    	while(c > '9' || c < '0') c = getchar() ;
    	while(c >= '0' && c <= '9')
    	 s = s * 10 + c - '0' , c = getchar() ;
    }
    void output(__int128 x)
    {
    	if(x > 9)
    	 output(x / 10) ;
    	putchar(x % 10 + '0') ;
    }
    int n , m ;
    __int128 f[MAXN][MAXN] ;
    __int128 game[MAXN][MAXN] ;
    __int128 solve(__int128 a[])
    {
    	memset(f , 0 , sizeof f) ;
    	for(int len = 0 ;len <= m ;len ++)
    	 for(int i = 1 ;i + len <= m ;i ++)
    	  f[i][i + len] = max(2 * f[i + 1][i + len] + 2 * a[i] , 2 * f[i][i + len - 1]  + 2 * a[i + len]) ;
    	return f[1][m] ;
    }
    __int128 ans = 0 ;
    int main()
    {
    	cin >> n >> m ;
    	for(int i = 1 ;i <= n ;i ++)
    	 for(int j = 1 ;j <= m ;j ++)
    	  input(game[i][j]) ;
    	for(int i = 1 ;i <= n ;i ++)
    	 ans += solve(game[i]) ;
    	output(ans) ;
    	return 0 ;
    }
    

    高精度相乘

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    
    using namespace std;
    
    const int MAXN = 85, Mod = 10000; //高精四位压缩大法好 
    int n, m;
    int ar[MAXN];
    
    struct HP {
        int p[505], len;
        HP() {
            memset(p, 0, sizeof p);
            len = 0;
        } //这是构造函数,用于直接创建一个高精度变量 
        void print() {
            printf("%d", p[len]);  
            for (int i = len - 1; i > 0; i--) {  
                if (p[i] == 0) {
                    printf("0000"); 
                    continue;
                }
                for (int k = 10; k * p[i] < Mod; k *= 10) 
                    printf("0");
                printf("%d", p[i]);
            }
        } //四位压缩的输出 
    } f[MAXN][MAXN], base[MAXN], ans;
    
    HP operator + (const HP &a, const HP &b) {
        HP c; c.len = max(a.len, b.len); int x = 0;
        for (int i = 1; i <= c.len; i++) {
            c.p[i] = a.p[i] + b.p[i] + x;
            x = c.p[i] / Mod;
            c.p[i] %= Mod;
        }
        if (x > 0)
            c.p[++c.len] = x;
        return c;
    } //高精+高精 
    
    HP operator * (const HP &a, const int &b) {
        HP c; c.len = a.len; int x = 0;
        for (int i = 1; i <= c.len; i++) {
            c.p[i] = a.p[i] * b + x;
            x = c.p[i] / Mod;
            c.p[i] %= Mod;
        }
        while (x > 0)
            c.p[++c.len] = x % Mod, x /= Mod;
        return c;
    } //高精*单精 
    
    HP max(const HP &a, const HP &b) {
        if (a.len > b.len)
            return a;
        else if (a.len < b.len)
            return b;
        for (int i = a.len; i > 0; i--)
            if (a.p[i] > b.p[i])
                return a;
            else if (a.p[i] < b.p[i])
                return b;
        return a;
    } //比较取最大值 
    
    void BaseTwo() {
        base[0].p[1] = 1, base[0].len = 1;
        for (int i = 1; i <= m + 2; i++){ //这里是m! m! m! 我TM写成n调了n年... 
            base[i] = base[i - 1] * 2;
        }
    } //预处理出2的幂 
    
    int main(void) {
        scanf("%d%d", &n, &m);
        BaseTwo();
        while (n--) {
            memset(f, 0, sizeof f);
            for (int i = 1; i <= m; i++)
                scanf("%d", &ar[i]);
            for (int i = 1; i <= m; i++)
                for (int j = m; j >= i; j--) { //因为终值是小区间,DP自然就从大区间开始 
                    f[i][j] = max(f[i][j], f[i - 1][j] + base[m - j + i - 1] * ar[i - 1]); 
                    f[i][j] = max(f[i][j], f[i][j + 1] + base[m - j + i - 1] * ar[j + 1]);
                } //用结构体重载运算符写起来比较自然 
            HP Max;
            for (int i = 1; i <= m; i++)
                Max = max(Max, f[i][i] + base[m] * ar[i]);
            ans = ans + Max; //记录到总答案中 
        }
        ans.print(); //输出 
        return 0;
    }
    
    每次做题提醒自己:题目到底有没有读懂,有没有分析彻底、算法够不够贪心、暴力够不够优雅。
  • 相关阅读:
    村上春树的《海边的卡夫卡》与中日现实
    熊的甜蜜世界
    VS创建dll和调用dll
    DIRECTSHOW在VS2005中PVOID64问题和配置问题
    Vs 2008 解决方案的目录结构设置和管理
    SQL Server 2008中的代码安全(二):DDL触发器与登录触发器
    如何在自动SGA管理模式下调节参数设置
    将ORACLE数据库从归档改成非归档状态
    查看oracle数据库是否归档和修改归档模式(转)
    oracle TRANSLATE函数详解
  • 原文地址:https://www.cnblogs.com/spnooyseed/p/12870881.html
Copyright © 2011-2022 走看看