• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            poj 2065 SETI

               題意比較糾結,搜索了把題意。
               給你一個素數P(P<=30000)和一串長為n的字符串str[]。字母'*'代表0,字母a-z分別代表1-26,這n個字符所代表的數字分別代表
            f(1)、f(2)....f(n)。定義: f (k) = ∑0<=i<=n-1aiki (mod p) (1<=k<=n,0<=ai<P),求a0、a1.....an-1。題目保證肯定有唯一解。
               解題思路:高斯消元。根據上面的公式顯然可以列出有n個未知數的n個方程式:
               a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)
               a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2)
               ..............
               a0*n^0 + a1*n^1+a2*n^2+........+an-1*n^(n-1) = f(n)
               然后采用高斯消元法來解上面的方程組即可。
               典型的高斯消元題,只是多了個modP,因此計算過程中可能需要擴展歐幾里德算法。

               說下所謂的高斯消元的思路,其實可以參看維基百科,
            http://zh.wikipedia.org/wiki/%E9%AB%98%E6%96%AF%E6%B6%88%E5%8E%BB%E6%B3%95,大致過程是一直消變量。
            比如剛開始,消第一個變量,消完之后只讓第一個方程含有第一個變量,然后消第二個變量,消完之后只讓第二個方程含第二個變量,以此
            下去讓最后的方程含最后一個變量,而且最后一個方程中對于前N-1個變量的系數都是0,這樣就能解出這N個變量了。
               關于自由元指的是這個變量可以取任何值,得出這樣的結論是在消變量的過程中發現該變量的在第row個方程到第N方程中的系數都是0了,
            所以可以取任何值。判斷無解的方式是,第row+1到第N個方程在高斯消元之后所有的系數必定是0,所以方程的值也必須是0。
               求方程的解得過程是從N個解開始逆推,第N-1個方程也就包含2個變量了,第N個變量和第N-1個變量,以此下去,就可以解出方程組了。
               具體的可以參照維基百科和代碼仔細分析。還有演算法筆記上也有高斯消元的解釋。

               代碼如下:
            #include <stdio.h>
            #include <string.h>
            #include <algorithm>
            using namespace std;
            #define MAX (70 + 10)

            int nMatrix[MAX][MAX];
            int nAns[MAX];
            void InitMatrix(char* szStr, int nN, int nP)
            {
                memset(nMatrix, 0, sizeof(nMatrix));
                for (int i = 0; i < nN; ++i)
                {
                    nMatrix[i][nN] = (szStr[i] == '*' ? 0 : szStr[i] - 'a' + 1);
                }
                for (int i = 0; i < nN; ++i)
                {
                    int nTemp = 1;
                    for (int j = 0; j < nN; ++j)
                    {
                        nMatrix[i][j] = nTemp;
                        nTemp = (nTemp * (i + 1)) % nP;
                    }
                }
            }

            int egcd(int nA, int nB, int& nX, int& nY)
            {
                if (nA < nB)swap(nA, nB);
                if (nB == 0)
                {
                    nX = 1, nY = 0;
                    return nA;
                }
                int nRet = egcd(nB, nA % nB, nX, nY);
                int nT = nX;
                nX = nY;
                nY = nT - (nA / nB) * nY;
                return nRet;
            }

            int Gauss(int nN, int nP)
            {
                int nR, nC;
                for (nR = nC = 0; nR < nN && nC < nN; ++nR, ++nC)
                {
                    if (nMatrix[nR][nC] == 0)
                    {
                        for (int i = nR + 1; i < nN; ++i)
                        {
                            if (nMatrix[i][nC])
                            {
                                for (int j = nC; j <= nN; ++j)
                                {
                                    swap(nMatrix[nR][j], nMatrix[i][j]);
                                }
                                break;
                            }
                        }
                    }

                    if (nMatrix[nR][nC] == 0)
                    {
                        nR--;    //自由元
                        continue;
                    }
                    int nA = nMatrix[nR][nC];
                    for (int i = nR + 1; i < nN; ++i)
                    {
                        if (nMatrix[i][nC])
                        {
                            int nB = nMatrix[i][nC];
                            for (int j = nC; j <= nN; ++j)
                            {
                                nMatrix[i][j] = (nMatrix[i][j] * nA - nMatrix[nR][j] * nB) % nP;
                            }
                        }
                    }
                }
                for (int i = nR; i < nN; ++i)
                {
                    if (nMatrix[i][nN])
                    {
                        return -1;//無解
                    }
                }
                
                int nX, nY;
                for (int i = nN - 1; i >= 0; i--)
                {
                    int nSum = 0;
                    for (int j = i + 1; j < nN; ++j)
                    {
                        nSum = (nSum + nMatrix[i][j] * nAns[j]) % nP;
                    }
                    
                    nSum = (nMatrix[i][nN] - nSum + nP * nP) % nP;
                    
                    egcd(nP, (nMatrix[i][i] + nP) % nP, nX, nY);
                    nY = (nY + nP) % nP;
                    nAns[i] = (nY * nSum + nP) % nP;//第i個解
                }
                return 1 << (nN - nR);//返回解的個數,本題有唯一解
            }

            int main()
            {
                int nT;

                scanf("%d", &nT);
                while (nT--)
                {
                    int nP;
                    int nN;
                    char szStr[MAX];
                    scanf("%d%s", &nP, szStr);
                    nN = strlen(szStr);
                    InitMatrix(szStr, nN, nP);
                    Gauss(nN, nP);
                    for (int i = 0; i < nN; ++i)
                    {
                        printf("%d%s", nAns[i], i == nN - 1 ? "\n" : " ");
                    }
                }

                return 0;
            }
               

            posted on 2012-08-06 16:01 yx 閱讀(894) 評論(0)  編輯 收藏 引用 所屬分類: 數學題

            <2012年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            精品无码人妻久久久久久| 国产亚洲美女精品久久久| 久久久国产一区二区三区| 久久久久久国产精品美女| 99久久免费国产精品| 久久影院综合精品| 久久天天躁狠狠躁夜夜2020| 久久精品国产99久久无毒不卡| 久久青青草原精品国产不卡| 中文字幕久久亚洲一区| 丰满少妇人妻久久久久久4| 午夜精品久久久久久久久| 一级做a爰片久久毛片免费陪 | 国内精品九九久久精品| 国产成人香蕉久久久久| 亚洲精品97久久中文字幕无码| 久久久久久九九99精品| 日韩中文久久| 欧美黑人激情性久久| 午夜精品久久久久成人| 精品久久久噜噜噜久久久| 国内精品久久久久久99蜜桃| 精品国产91久久久久久久a| 久久久老熟女一区二区三区| 久久久不卡国产精品一区二区| 国产精品久久久久天天影视| 九九久久99综合一区二区| 青青草国产精品久久| 久久久久无码精品国产app| 俺来也俺去啦久久综合网| 亚洲中文字幕无码久久2017| 国产一区二区精品久久凹凸| 97久久国产亚洲精品超碰热| 久久国产热精品波多野结衣AV | 久久人爽人人爽人人片AV| 久久国产劲爆AV内射—百度| 91视频国产91久久久| 国产精品99久久久久久人| 99久久精品毛片免费播放| 日本一区精品久久久久影院| aaa级精品久久久国产片|