• <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 2886 Who Gets the Most Candies? 約瑟夫環(huán)和反素?cái)?shù)

               直接模擬約瑟夫環(huán)是N^2,況且這題每次移動(dòng)的距離和方向都是不確定的,只能模擬,如果加快查找和移動(dòng)的話,
            可以提高速度,果斷用線段樹維護(hù)當(dāng)前位置前面有多少個(gè)人。
               至于反素?cái)?shù)指的是求一個(gè)小于等于N的數(shù)字,使得其因子個(gè)數(shù)在1-N中是最大的。這個(gè)利用一個(gè)必要條件暴力搜索即可。
            其實(shí)就是利用下面這2個(gè)性質(zhì)搜索的。
               性質(zhì)一:一個(gè)反素?cái)?shù)的質(zhì)因子必然是從2開始連續(xù)的質(zhì)數(shù)。
            性質(zhì)二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....。

               代碼如下:
            #include <stdio.h>
            #include <string.h>
            #include <math.h>
            #include <algorithm>
            using namespace std;

            int nPrime[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
            int nAns;
            int nCN;
            const int MAX_N = 500010;
            //nPow不會(huì)超過20
            void InitBest(int nCur, int nI, int nMax, int nN, int nNum)
            {
                if (nCur > nN) return;
                if (nNum > nCN){nAns = nCur;nCN = nNum;}
                if (nNum == nCN){nAns = min(nAns, nCur);}
                for (int i = 1; i <= nMax; ++i)
                {
                    nCur *= nPrime[nI];
                    if (nCur > nN)return;//不加這句優(yōu)化會(huì)超時(shí)
                    if (nI < 15)
                    InitBest(nCur, nI + 1, i, nN, nNum * (i + 1));
                }
            }

            char szNames[MAX_N][10];
            int nValue[MAX_N];
            int nTree[MAX_N << 2];
            void PushUp(int nRt)
            {
                nTree[nRt] = nTree[nRt << 1] + nTree[nRt << 1 | 1];
            }

            void BuildTree(int nL, int nR, int nRt, int nV)
            {
                if (nL == nR)
                {
                    nTree[nRt] = nV;
                    return;
                }
                int nMid = (nL + nR) >> 1;
                BuildTree(nL, nMid, nRt << 1, nV);
                BuildTree(nMid + 1, nR, nRt << 1 | 1, nV);
                PushUp(nRt);
            }

            void Add(int nL, int nR, int nRt, int nP, int nV)
            {
                if (nL == nR)
                {
                    nTree[nRt] += nV;
                }
                else
                {
                    int nMid = (nL + nR) >> 1;
                    if (nP <= nMid)Add(nL, nMid, nRt << 1, nP, nV);
                    else Add(nMid + 1, nR, nRt << 1 | 1, nP, nV);
                    PushUp(nRt);
                }
            }

            int Query(int nL, int nR, int nRt, int nSum)
            {
                if (nL == nR)
                {
                    return nL;
                }
                int nMid = (nL + nR) >> 1;
                int nLs = nRt << 1;
                int nRs = nLs | 1;
                if (nTree[nLs] >= nSum) return Query(nL, nMid, nLs, nSum);
                else return Query(nMid + 1, nR, nRs, nSum - nTree[nLs]);
            }

            int main()
            {
                //InitBest(1, 0, 15);
                int nN, nK;
                
                while (scanf("%d%d", &nN, &nK) == 2)
                {
                    nK--;
                    nAns = 2;
                    nCN = 0;
                    InitBest(1, 0, 20, nN, 1);
                    //printf("ans:%d cn:%d\n", nAns, nCN);
                    for (int i = 0; i < nN; ++i)
                    {
                        scanf("%s%d", szNames[i], &nValue[i]);
                    }
                    
                    BuildTree(0, nN - 1, 1, 1);
                    int nTotal = nN;
                    int nPos;
                    for (int i = 0; i < nAns; ++i)
                    {
                        nPos = Query(0, nN - 1, 1, nK + 1);
                        //printf("nK:%d %s %d\n", nK, szNames[nPos], nValue[nPos]);
                        nTotal--;
                        Add(0, nN - 1, 1, nPos, -1);
                        if (!nTotal)break;
                        if (nValue[nPos] >= 0)
                        {
                            nK = (nK - 1 + nValue[nPos] + nTotal) % nTotal;
                        }
                        else
                        {
                            nK = ((nK + nValue[nPos]) % nTotal + nTotal) % nTotal;
                        }
                    }
                    printf("%s %d\n", szNames[nPos], nCN);
                }
                
                return 0;
            }

            posted on 2012-09-14 20:53 yx 閱讀(1315) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學(xué)

            網(wǎng)友

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久久综合网天天| 亚洲国产精品久久久久| 久久AⅤ人妻少妇嫩草影院| 国内精品人妻无码久久久影院| 国产成人精品综合久久久| 女同久久| 亚洲精品美女久久久久99小说| 久久精品亚洲精品国产欧美| 一级做a爱片久久毛片| 亚洲国产成人久久精品影视| 88久久精品无码一区二区毛片 | 污污内射久久一区二区欧美日韩| 青青热久久国产久精品| 亚洲精品tv久久久久久久久久| 久久天天躁狠狠躁夜夜2020老熟妇| 精品欧美一区二区三区久久久| 久久国产成人午夜AV影院| 亚洲欧美日韩精品久久亚洲区| 伊色综合久久之综合久久| 99久久99久久精品国产片果冻| 亚洲午夜久久久影院| 91精品国产色综合久久| 99久久精品无码一区二区毛片 | 欧美久久综合九色综合| 久久婷婷午色综合夜啪| 久久精品午夜一区二区福利| 国产精品99久久久久久猫咪 | 丁香五月综合久久激情| 久久天天躁狠狠躁夜夜不卡| 久久99国产综合精品| 久久综合成人网| 91久久精品91久久性色| 一级A毛片免费观看久久精品| 99久久精品国产高清一区二区| 思思久久99热免费精品6| 2022年国产精品久久久久| 亚洲国产成人久久一区久久| 精品人妻久久久久久888| 久久精品国产欧美日韩99热| 亚洲欧美精品伊人久久| 亚洲精品无码久久千人斩|