POJ 1166The Clocks 高斯消元 + exgcd(純屬瞎搞)

來源:互聯網
上載者:User

標籤:style   os   io   for   ar   cti   amp   size   

根據題意可構造出方程組,方程組的每個方程格式均為:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki;

高斯消元構造上三角矩陣,以最後一個一行為例:

C*x9 = sum + 4*k,exgcd求出符合範圍的x9,其他方程在代入已知的變數後格式亦如此。

第一發Gauss,蠻激動的。

#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <cmath>#include <stack>#include <map>#include <ctime>#pragma comment(linker, "/STACK:1024000000");#define EPS (1e-8)#define LL long long#define ULL unsigned long long#define _LL __int64#define INF 0x3f3f3f3f#define Mod 6000007using namespace std;const int MAXN = 20;int up[] = {0,4,3,4,3,5,3,4,3,4};int site[10][5] = {{0},{1,2,4,5},{1,2,3},{2,3,5,6},{1,4,7},{2,4,5,6,8},{3,6,9},{4,5,7,8},{7,8,9},{5,6,8,9}};int Map[10];LL coe[MAXN][MAXN];LL sol[MAXN];void Output(){    int i,j;    for(i = 1;i <= 9; ++i)    {        for(j = 1;j <= 10; ++j)        {            printf("%lld ",coe[i][j]);            if(j == 9)                printf("= ");        }        printf("\n");    }    puts("");}LL Abs(LL x){    if(x < 0)        return -x;    return x;}LL gcd(LL x,LL y){    if(y == 0)        return x;    return gcd(y,x%y);}void exgcd(LL a,LL b,LL &x,LL &y){    if(b == 0)        x = 1,y = 0;    else    {        LL x1,y1;        exgcd(b,a%b,x1,y1);        x = y1;        y = x1-a/b*y1;    }}//n為行數,m為列數(包含最後一項)//return -1無整數解 return 0存在整數解。int Gauss(int n,int m){    int i,j,k;    LL T,A,B;    //Output();    for(i = 1;i < n; ++i)    {        for(j = i+1;j <= n; ++j)        {            if(coe[j][i] == 0)                continue;            if(coe[i][i] == 0)            {                for(k = i;k <= m; ++k)                    T = coe[i][k],coe[i][k] = coe[j][k],coe[j][k] = T;                continue;            }            T = gcd(coe[i][i],coe[j][i]);            A = coe[j][i]/T,B = coe[i][i]/T;            for(k = i;k <= m; ++k)                coe[j][k] = coe[i][k]*A - coe[j][k]*B;        }        //Output();    }    LL sum = 0;    for(i = n;i >= 1; --i)    {        sum = coe[i][m];        for(j = m-1;j > i; --j)            sum -= coe[i][j]*sol[j];        LL A = coe[i][i],B = 4,C = sum;        LL x,y;        exgcd(A,B,x,y);        //cout<<"A = "<<A<<" B = "<<B<<" C = "<<C<<" x = "<<x<<" y = "<<y<<endl;        x *= C/gcd(A,B);        //cout<<"x = "<<x<<endl;        y = B/gcd(A,B);        x = (x-x/y*y + Abs(y))%Abs(y);        sol[i] = x;        //cout<<"i = "<<i<<" x = "<<x<<endl;//        if(sum%coe[i][i] != 0)//            return -1;//此時無整數解//        sol[i] = sum/coe[i][i];    }    return 0;}int main(){    int i,j;    for(i = 1;i <= 9; ++i)        scanf("%d",&Map[i]);    memset(coe,0,sizeof(coe));    for(i = 1;i <= 9; ++i)    {        for(j = 0;j < up[i]; ++j)        {            coe[site[i][j]][i] = 1;        }    }    for(i = 1;i <= 9; ++i)        coe[i][10] = (4-Map[i])%4;    if(-1 == Gauss(9,10))        while(0)        ;    bool mark = true;    for(i = 1;i <= 9;++i)    {        for(j = 0;j < sol[i]; ++j)        {            if(mark == false)                printf(" ");            else                mark = false;            printf("%d",i);        }    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.