• <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

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

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

               代碼如下:
            #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個(gè)解
                }
                return 1 << (nN - nR);//返回解的個(gè)數(shù),本題有唯一解
            }

            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 閱讀(901) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)學(xué)題

            <2015年2月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            1234567

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學(xué)

            網(wǎng)友

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产精品久久国产精品99盘 | 久久久久久久久久久免费精品| 99精品久久精品一区二区| 久久精品aⅴ无码中文字字幕重口| 国产精品久久久福利| 亚洲国产精品成人AV无码久久综合影院| 亚洲欧美一区二区三区久久| 伊人久久综合精品无码AV专区 | 久久播电影网| 精品久久人人爽天天玩人人妻| 亚洲国产精品久久电影欧美| 久久精品国产久精国产| 久久AV无码精品人妻糸列| 久久美女网站免费| 囯产极品美女高潮无套久久久| 久久本道伊人久久| 亚洲中文字幕无码久久综合网| 欧美久久综合性欧美| 少妇久久久久久久久久| 日韩欧美亚洲综合久久影院Ds | 亚洲精品无码久久久影院相关影片| 日韩精品久久久久久| 亚洲熟妇无码另类久久久| 久久久久亚洲精品无码网址| 精品久久一区二区三区| 精品久久久久久中文字幕大豆网| 久久精品成人影院| 久久er国产精品免费观看8| 久久国产欧美日韩精品| 亚洲精品无码久久久久| 免费无码国产欧美久久18| 亚洲精品tv久久久久| 久久免费香蕉视频| 久久精品一区二区三区中文字幕 | 中文字幕日本人妻久久久免费 | 人妻久久久一区二区三区| 精品久久久一二三区| 午夜精品久久久久久影视riav| 久久婷婷人人澡人人| 无码乱码观看精品久久| 久久香蕉国产线看观看猫咪?v|