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

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評論 - 47, 引用 - 0
            數(shù)據(jù)加載中……

            POJ 2132 Cow Math 二分

            思路:
            首先每條路徑的值都可以分解一下質(zhì)因數(shù),就可以表示為多個(gè)質(zhì)數(shù)的冪相乘的形式,
             比如 2^6 * 3^8 * 17^22 * 23^1。

            三個(gè)數(shù)字a, b, c求最大公約數(shù),分解完質(zhì)因數(shù)后:
            如果a擁有2^8,b擁有2^10,c擁有2^4。那最大公約數(shù)必然擁有2^4,取最小的一個(gè)。
            對于每個(gè)質(zhì)數(shù) 2, 3, 5, 7。。都是這個(gè)道理。

            如果是求最小公倍數(shù),在剛剛的例子里,就是取最大的一個(gè)了。

            在點(diǎn)之間行走的過程,可以這樣來看。在點(diǎn)1的時(shí)候GCF的值是所有質(zhì)數(shù)的最大次冪的乘積。
            GCF的值必定是越走越小。
            每經(jīng)過一條路徑,CGF各個(gè)質(zhì)因數(shù)的冪都必須小于等于路徑的對應(yīng)的值。
            就好比路徑就只能容納這么大的流量。然后到達(dá)點(diǎn)2的時(shí)候,看看哪條路徑的流量最大。
            看起來像最大流問題,但不是最大流問題。

            我們沒辦法遍歷一次圖,就求出哪條路徑的流量最大。
            但由于路徑的權(quán)值最大才2000,質(zhì)因數(shù)的冪最大也只有11(2^11 = 2048),大不了每個(gè)冪都試一次。
            用二分法就可以了。

            對于每一個(gè)質(zhì)數(shù),求到達(dá)點(diǎn)2 的時(shí)候的最大的冪。
            最后再乘起來,就是答案了。
            可見這種方法還是很巧妙的,效率也很高,0ms AC。

            注意:
            不需要高精度。但需要用__int64來保存答案。

            #include <stdio.h>

            #define MAX_W 2048
            #define MAX_N 32 

            int N, visit[MAX_N], map[MAX_N][MAX_N], tm;
            int prime[MAX_W], prime_cnt, max_cnt[MAX_W];

            int dfs(int idx, int val, int cnt)
            {
                
            int i, j, k;

                
            if (idx == 2)
                    
            return 1;

                visit[idx] 
            = tm;
                
            for (i = 1; i <= N; i++{
                    
            if (visit[i] == tm)
                        
            continue;
                    j 
            = map[idx][i];
                    
            for (k = 0; j && !(j % val); k++)
                        j 
            /= val;
                    
            if (k < cnt)
                        
            continue;
                    
            if (dfs(i, val, cnt))
                        
            return 1;
                }


                
            return 0;
            }


            __inline 
            int calc(int val, int r)
            {
                
            int l, m;

                l 
            = 0;
                
            while (l <= r) {
                    m 
            = (l + r) / 2;
                    tm
            ++;
                    
            if (dfs(1, val, m))
                        l 
            = m + 1;
                    
            else
                        r 
            = m - 1;
                }


                
            return r;
            }


            int main()
            {
                
            int i, j, val, p, cnt;
                __int64 r;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                prime[prime_cnt
            ++= 2;
                
            for (i = 3; i < MAX_W; i++{
                    
            for (j = 0; j < prime_cnt && (i % prime[j]); j++);
                    
            if (j == prime_cnt)
                        prime[prime_cnt
            ++= i;
                }

                
                scanf(
            "%d"&N);
                
            for (i = 1; i <= N; i++)
                    
            for (j = 1; j <= N; j++)
                        scanf(
            "%d"&map[i][j]);
                
                
            for (i = 2; i <= N; i++{
                    val 
            = map[1][i];
                    
            for (j = 0; j < prime_cnt && val >= 1; j++{
                        p 
            = prime[j];
                        
            for (cnt = 0!(val % p); cnt++)
                            val 
            /= p;
                        
            if (cnt > max_cnt[j])
                            max_cnt[j] 
            = cnt;
                    }

                }

                
                
            for (i = 0; i < prime_cnt; i++{
                    
            if (!max_cnt[i])
                        
            continue;
                    max_cnt[i] 
            = calc(prime[i], max_cnt[i]);
                }


                r 
            = 1;
                
            for (i = 0; i < prime_cnt; i++{
                    
            if (!max_cnt[i])
                        
            continue;
                    
            for (cnt = 0; cnt < max_cnt[i]; cnt++)
                        r 
            *= prime[i];
                }

                printf(
            "%I64d\n", r);

                
            return 0;
            }

            posted on 2010-03-14 14:37 糯米 閱讀(636) 評論(1)  編輯 收藏 引用 所屬分類: POJ

            評論

            # re: POJ 2132 Cow Math 二分[未登錄]  回復(fù)  更多評論   

            POJ 2132 Cow Math 二分

            思路:
            首先每條路徑的值都可以分解一下質(zhì)因數(shù),就可以表示為多個(gè)質(zhì)數(shù)的冪相乘的形式,
            比如 2^6 * 3^8 * 17^22 * 23^1。

            三個(gè)數(shù)字a, b, c求最大公約數(shù),分解完質(zhì)因數(shù)后:
            如果a擁有2^8,b擁有2^10,c擁有2^4。那最大公約數(shù)必然擁有2^4,取最小的一個(gè)。
            對于每個(gè)質(zhì)數(shù) 2, 3, 5, 7。。都是這個(gè)道理。

            如果是求最小公倍數(shù),在剛剛的例子里,就是取最大的一個(gè)了。

            在點(diǎn)之間行走的過程,可以這樣來看。在點(diǎn)1的時(shí)候GCF的值是所有質(zhì)數(shù)的最大次冪的乘積。
            GCF的值必定是越走越小。
            每經(jīng)過一條路徑,CGF各個(gè)質(zhì)因數(shù)的冪都必須小于等于路徑的對應(yīng)的值。
            就好比路徑就只能容納這么大的流量。然后到達(dá)點(diǎn)2的時(shí)候,看看哪條路徑的流量最大。
            看起來像最大流問題,但不是最大流問題。

            我們沒辦法遍歷一次圖,就求出哪條路徑的流量最大。
            但由于路徑的權(quán)值最大才2000,質(zhì)因數(shù)的冪最大也只有11(2^11 = 2048),大不了每個(gè)冪都試一次。
            用二分法就可以了。

            對于每一個(gè)質(zhì)數(shù),求到達(dá)點(diǎn)2 的時(shí)候的最大的冪。
            最后再乘起來,就是答案了。
            可見這種方法還是很巧妙的,效率也很高,0ms AC。

            注意:
            不需要高精度。但需要用__int64來保存答案。


            #include <stdio.h>

            #define MAX_W 2048
            #define MAX_N 32

            int N, visit[MAX_N], map[MAX_N][MAX_N], tm;
            int prime[MAX_W], prime_cnt, max_cnt[MAX_W];

            int dfs(int idx, int val, int cnt)
            {
            int i, j, k;

            if (idx == 2)
            return 1;

            visit[idx] = tm;
            for (i = 1; i <= N; i++) {
            if (visit[i] == tm)
            continue;
            j = map[idx][i];
            for (k = 0; j && !(j % val); k++)
            j /= val;
            if (k < cnt)
            continue;
            if (dfs(i, val, cnt))
            return 1;
            }

            return 0;
            }

            __inline int calc(int val, int r)
            {
            int l, m;

            l = 0;
            while (l <= r) {
            m = (l + r) / 2;
            tm++;
            if (dfs(1, val, m))
            l = m + 1;
            else
            r = m - 1;
            }

            return r;
            }

            int main()
            {
            int i, j, val, p, cnt;
            __int64 r;

            freopen("e:\\test\\in.txt", "r", stdin);

            prime[prime_cnt++] = 2;
            for (i = 3; i < MAX_W; i++) {
            for (j = 0; j < prime_cnt && (i % prime[j]); j++);
            if (j == prime_cnt)
            prime[prime_cnt++] = i;
            }

            scanf("%d", &N);
            for (i = 1; i <= N; i++)
            for (j = 1; j <= N; j++)
            scanf("%d", &map[i][j]);

            for (i = 2; i <= N; i++) {
            val = map[1][i];
            for (j = 0; j < prime_cnt && val >= 1; j++) {
            p = prime[j];
            for (cnt = 0; !(val % p); cnt++)
            val /= p;
            if (cnt > max_cnt[j])
            max_cnt[j] = cnt;
            }
            }

            for (i = 0; i < prime_cnt; i++) {
            if (!max_cnt[i])
            continue;
            max_cnt[i] = calc(prime[i], max_cnt[i]);
            }

            r = 1;
            for (i = 0; i < prime_cnt; i++) {
            if (!max_cnt[i])
            continue;
            for (cnt = 0; cnt < max_cnt[i]; cnt++)
            r *= prime[i];
            }
            printf("%I64d\n", r);

            return 0;
            }
            2014-08-07 14:52 | 糯米
            国产精品毛片久久久久久久| 国产99久久久国产精品小说| 久久综合九色综合欧美狠狠| 欧美国产精品久久高清| 超级97碰碰碰碰久久久久最新 | 久久久久亚洲AV成人网人人网站| 久久久亚洲欧洲日产国码二区 | 久久精品免费网站网| 中文字幕热久久久久久久| 99久久伊人精品综合观看| 久久www免费人成看片| 久久精品成人免费国产片小草| 日本强好片久久久久久AAA| 久久e热在这里只有国产中文精品99 | 亚洲七七久久精品中文国产| 久久精品人人做人人爽电影| 久久久久久久久久久精品尤物| www性久久久com| 亚洲国产欧洲综合997久久| 久久综合狠狠综合久久97色| 久久精品国产99国产精品澳门 | 97久久超碰国产精品2021| 日韩精品久久久久久久电影蜜臀| 久久精品国产福利国产琪琪| 久久国产免费观看精品| 久久久久人妻一区二区三区vr| 2020久久精品亚洲热综合一本| 久久久久国产| 久久久久久亚洲精品无码| 99久久精品免费看国产| 亚洲狠狠综合久久| 国产成人AV综合久久| 国产午夜久久影院| 久久精品国产只有精品2020| 精品熟女少妇a∨免费久久| 精品久久久噜噜噜久久久| 蜜臀av性久久久久蜜臀aⅴ| 日产精品99久久久久久| 成人综合伊人五月婷久久| 伊人色综合久久天天| 久久影院亚洲一区|