[NKU]sweet @ Google && TopCoder && CodeForces

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks

          #

          昨晚,我們進行了會議,議定了做題方案,以及各種情況的處理方法,得到結論:打好開局,不要慌亂。

          早上準時起床,吃早飯,一切正常,不慌不亂……扛著一箱子書+模版,我們上三樓……八點半,比賽準時開始。

          拿到題后按照之前的計劃分工讀題,我倒著,SXJ正著,MXD中間,很快MXD發(fā)現(xiàn)D題是熱身賽我們做出的那道題目的三維擴展,于是我和SXJ一起做,SXJ繼續(xù)讀題。做到一半,MXD讀到 B題,激動地喊出:梅森數(shù)!B的題意是給你一個<258的數(shù)n,讓你判2^n+1是不是素數(shù),這個就是梅森數(shù)……他想起了他的課本上有個表,找到 表,我打表上交……似乎judge出了點毛病,一直都沒有判……期間,我和SXJ繼續(xù)寫D,寫完上交,WA了……然后我發(fā)現(xiàn)一個低級錯誤修改后再交,依然 WA。同時MXD讀題、觀察全場,發(fā)現(xiàn)似乎沒有別的題比較好做,于是我們三個人一同做D題,在此途中,我要求RejudgeB,返回AC……此時我和 SXJ繼續(xù)做D題,MXD讀題,觀察場上,發(fā)現(xiàn)E題有人通過了。我們決定做完D題再看下一道。我們三個人通過討論做出了D題。不得不感嘆,學習要求甚 解……我們那道二維的猜出了結論,三維的就猜不出了……推了半天,接下來我們閱讀E題,E題意是這樣:長度70的150個子串,在一個10^6的母串里匹 配,問出現(xiàn)次數(shù)最多的串。大概兩種想法,一種是KMP、Rabin-Karp系列的算法硬水,一種是SA。我們發(fā)現(xiàn)場上有十幾個隊伍通過了E題,估計不是 SA(SA不會普及成這樣吧……),于是我照TC模版寫了個KMP,交上去,TLE……我們覺得KMP系算法應該是超時的,于是我和MXD一起想E題的后 綴數(shù)組,SXJ繼續(xù)讀題,觀察全場,發(fā)現(xiàn)其他題有隊伍通過了,但是那些題都在我們能力范圍之外……我們平時后綴數(shù)組寫的就少,這時硬想心里也沒底……眼看 Rank就掉出前60,要拿鐵了……我們繼續(xù)沉著冷靜……討論了半天,我想出了一個可能對的方法。我們決定再水一下,用別的KMP模版重寫E題,如果不過 再用后綴數(shù)組搞下。SXJ重寫了E題,提交后錯誤。由于TLE是優(yōu)先于WA的,我們看到了希望……我注意到一個題目理解問題,如果答案是0,是輸出所有串 還是不輸出……詢問了Judge,得到了一個不置可否的回答。SXJ按照另一種理解修改后通過。這時Rank45,之后我們討論了其他問題,但是無所斬 獲。封榜前Rank47,不拿鐵的目標算是完成了……可惜我們WA太多,沒能拿到Ag……

          接下來一個小時完全進入牛校的Show Time,先是清華的隊屢屢過題后狂喊:牛13!,然后是北大的隊伍最后一分鐘過題(那隊真是慢熱型,前3小時始終落后于我們,但是最后題該出的都出了……金牌第二……)

          下午無聊……晚上頒獎,順利拿到Cu……外加ICPC第30名的排名證書(那個證書只有前30才有……RP好啊)

          晚上宴會,大吃一頓,然后回賓館上網(wǎng)了……

          總體來講,我們沒有失誤,B題那個表是有點超常發(fā)揮了,發(fā)揮中規(guī)中矩。300銅500銀1000金這個定律果然不假……我們的戰(zhàn)斗力果然只有銅……

          身 為菜鳥首秀,基本上可以滿意……但是今年我們想要拿Ag,需要一些超常發(fā)揮,今后想要拿Au,就得向1000發(fā)展……任重而道遠,不過我還年輕,還有很多 時間……看看TC上的紅牛前幾,前5中,樓爺基本是對數(shù)型增長……有的BT黃幾次就紅了,那些人的天賦我們是學不來的,要學就學7、8名之后那些人,人家 是練出來的。從綠掙扎到紅,奮斗了兩三年……

          好在我才大一,還花的起這2~3年,F(xiàn)ight,Sweet!
          posted @ 2010-08-21 15:46 sweetsc 閱讀(154) | 評論 (0)編輯 收藏

          諸位,Welcome~

          前一陣一直在用人人……后來感覺還是要有個技術Blog……于是決定把這里復活……

          我會主要在這里寫一些關于ACM/ICPC、Topcoder、以及其它競賽的文章
          競賽不是全部,我也會寫一些感興趣的相關技術……
          盡管是在javablog,而且我本意很想寫成java的,但是有時還是難免使用C++,因為在競賽中使用java,有利也有弊……

          從ACM界退休之后,更多的是認識到自己的不足:ACM競賽盡管很有意義,但是也有其局限性……解題或者說解決問題固然重要,找到問題才是最重要的;
          而且有好多問題,是在競賽中遇不到的。于是我表示,為了快點跟上實驗室主流的步伐,爭取每天在Days的基礎上,再寫一篇技術Blog……
          好吧,這每天一篇壓力太大了……外加近日壓力很大,主要是受到外界的壓力,一個月一篇都無法保證……不過無論如何,我還是會刷題,繼續(xù)學點算法知識,為人生第10個賽季,NKU -> HOT ENCORE做準備,在有參賽資格的情況下,我永遠是NKU的ACM/ICPC contestant,會向著Au或許緩慢但是堅定的邁進……

          近況神馬的詳見人人吧……
          好好寫日志,爭取讓讀者們有所收獲……
          posted @ 2010-07-26 21:41 sweetsc 閱讀(127) | 評論 (0)編輯 收藏

          題目要求:
          給出一個整數(shù)A,求它的B次冪的所有因數(shù)的和
          (0 <= A,B <= 50000000)
          樣例:A=2,B=3,則答案是1+2+4+8=15
          算法:
          看到數(shù)據(jù)范圍巨大,硬搞是不成的

          根據(jù)唯一分解定理,A可以分解成一系列質數(shù)的冪的形式:
          A=p1^a1 * P2^a2.....*Pn^an
          (P1,P2……是質數(shù))
          所以,A^B=p1^(a1*B) * P2*(a2*B).....Pn^(an*B)
          然后,A^B的因數(shù),設某個因數(shù)為C,則C可以表示成
          C=p1^c1 * p2^c2……* pn^cn
          其中0<=ci<=ai*B
          這樣一來,給所有因數(shù)求和,就相當給所有形如C的數(shù)求和
          接下來通過合并同類項,得到一個簡潔的形式
          sum=(1+p1+p1^2..+p1^(a1*B))(1+p2+p2^2...+p2^(a2*b)).....(1+pn+pn^2+....+pn^(an*B))
          分別把每項中的等比數(shù)列求和算出相乘即可

          這道題還有一個小Trick:
          為了避免高精度計算,答案需要Mod9901輸出,但是這導致直接應用(p^(n+1)-1)/(p-1)的公式進行等比數(shù)列求和行不通
          因為p-1和9901不見得就互素,經查閱資料,得到了一個基于二分法的方法:
          1+p1+p1^2+....+p1^n=p1^(n/2)*(1+p1+.....+p1^(n/2-1))
          問題得到解決
           1 import java.util.*;
           2 
           3 
           4 public class Main {
           5 
           6     static long modPow(long a,long n)
           7     {
           8         long MOD=9901;
           9         if (n==1return a%MOD;
          10         long tmp=modPow(a,n>>1);
          11         tmp=tmp*tmp%MOD;
          12         if ((n&1)==1) tmp=tmp*a%MOD;
          13         return tmp;
          14     }
          15 
          16     static long myPow(long a,long n)
          17     {
          18         if (n==0return 1;
          19         long ans=modPow(a,(n>>1)+1);
          20         ans=(ans+1)%9901;
          21         if ((n&1)==1)
          22             ans=ans*myPow(a,n>>1)%9901;
          23         else
          24         {
          25             ans=ans*myPow(a,(n-1)>>1)%9901;
          26             ans=ans+modPow(a,n>>1);
          27         }
          28         return ans%9901;
          29     }
          30 
          31     public static void main(String[] args) {
          32         Scanner cin=new Scanner(System.in);
          33         long a=cin.nextLong();
          34         long b=cin.nextLong();
          35         long ans=1;
          36         for (long i=2;i*i<=a;i++)
          37         if (a%i==0)
          38         {
          39             long pow=0;
          40             while (a%i==0)
          41             {
          42                 a/=i;
          43                 pow++;
          44             }
          45             pow*=b;
          46             ans=ans*myPow(i,pow)%9901;
          47         }
          48         if (a!=1)
          49             ans=ans*myPow(a,b)%9901;
          50         System.out.println((ans+9901)%9901);
          51     }
          52 }
          53 


          posted @ 2010-02-22 17:42 sweetsc 閱讀(1477) | 評論 (0)編輯 收藏


          再次介紹我自己,OI界摸爬滾打5年半的老菜鳥,ACM/ICPC摸爬滾打半年的09級新人……
          為啥轉移到了javablog呢?
          今后爭取把主語言轉為java……
          不過這里的代碼不見得都是java,畢竟ICPC題,java的IO還是很吃虧的,TC爭取都java……

          今天寫計算機科學概論論文,順道寫了個題:SPOJ 21

              給出n條記錄(n<=100000),形如 03 10103538 2222 1233 6160 0142
              要求將它們按字典序排序,并且統(tǒng)計每組記錄的出現(xiàn)次數(shù)
              例如:
              6
              03 10103538 2222 1233 6160 0142
              03 10103538 2222 1233 6160 0141
              30 10103538 2222 1233 6160 0141
              30 10103538 2222 1233 6160 0142
              30 10103538 2222 1233 6160 0141
              30 10103538 2222 1233 6160 0142
              輸出:
              03 10103538 2222 1233 6160 0141 1
              03 10103538 2222 1233 6160 0142 1
              30 10103538 2222 1233 6160 0141 2
              30 10103538 2222 1233 6160 0142 2

          算法:10000為基的基數(shù)排序+10000的計數(shù)排序

          復雜度O(N)

            1 #include <cstdio>
            2 #include <cstring>
            3 
            4 inline int nextInt()
            5 {
            6     int ans=0;
            7     for (;;)
            8     {
            9         char c=getchar();
           10         if (c<'0'||c>'9')
           11             break;
           12         ans=(ans<<3)+(ans<<1)+c-'0';
           13     }
           14     return ans;
           15 }
           16 
           17 struct node
           18 {
           19     int key[7];
           20 };
           21 bool operator ==(node a,node b)
           22 {
           23     for (int i=0;i<7;i++)
           24         if (a.key[i]!=b.key[i])
           25             return 0;
           26     return 1;
           27 }
           28 
           29 inline void nextNode(node &ans)
           30 {
           31     ans.key[0]=nextInt();
           32     int tmp=0;
           33     for (int i=0;i<4;i++)
           34     {
           35         char c=getchar();
           36         tmp=(tmp<<3)+(tmp<<1)+c-'0';
           37     }
           38     ans.key[1]=tmp;
           39     for (int i=2;i<7;i++)
           40         ans.key[i]=nextInt();
           41     getchar();
           42 }
           43 
           44 node arr[100010];
           45 
           46 int cnt[10010];
           47 int n;
           48 int arr1[100010];
           49 int arr2[100010];
           50 int *now;
           51 int *sorted;
           52 
           53 int KEY[100010];
           54 
           55 void mysort(int s)
           56 {
           57     memset(cnt,0,sizeof(cnt));
           58     for (int i=0;i<n;i++)
           59         KEY[i]=arr[now[i]].key[s];
           60     for (int i=0;i<n;i++)
           61         cnt[KEY[i]]++;
           62     for (int i=1;i<=10000;i++)
           63         cnt[i]+=cnt[i-1];
           64     for (int i=n-1;i>=0;i--)
           65         sorted[--cnt[KEY[i]]]=now[i];
           66 }
           67 
           68 void printNode(node a)
           69 {
           70     printf("%02d ",a.key[0]);
           71     printf("%04d%04d",a.key[1],a.key[2]);
           72     for (int i=3;i<7;i++)
           73         printf(" %04d",a.key[i]);
           74 }
           75 
           76 int main()
           77 {
           78     int nn=nextInt();
           79     while (nn--)
           80     {
           81         n=nextInt();
           82         now=arr1;
           83         sorted=arr2;
           84         for (int i=0;i<n;i++)
           85         {
           86             nextNode(arr[i]);
           87             now[i]=i;
           88         }       
           89         for (int i=6;i>=0;i--)
           90         {
           91             mysort(i);
           92             int *tmp=now;
           93             now=sorted;
           94             sorted=tmp;
           95         }
           96         for (int i=0,j=i;i<n;i=j)
           97         {
           98             node Now=arr[now[i]];
           99             int cnt=0;
          100             for (;Now==arr[now[j]];j++,cnt++);
          101             printNode(arr[now[i]]);
          102             printf(" %d\n",cnt);
          103         }
          104         if (nn) putchar(10);
          105         getchar();
          106     }
          107     return 0;
          108 }
          posted @ 2010-02-21 18:05 sweetsc 閱讀(144) | 評論 (0)編輯 收藏

          僅列出標題
          共4頁: 上一頁 1 2 3 4 
          主站蜘蛛池模板: 澎湖县| 肇源县| 大同市| 安康市| 台中市| 中卫市| 夏邑县| 同江市| 北辰区| 汤阴县| 策勒县| 桦南县| 兴业县| 托克托县| 丹棱县| 华亭县| 神池县| 神农架林区| 南开区| 汶川县| 岳池县| 郓城县| 江永县| 嵊州市| 徐州市| 方山县| 凤山市| 桑植县| 晋中市| 武定县| 老河口市| 天镇县| 通城县| 武邑县| 合水县| 怀来县| 梅州市| 镇巴县| 繁昌县| 商丘市| 若羌县|