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

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks

#

昨晚,我们进行了会议,议定了做题方案,以及各种情况的处理方法,得到结论:打好开局,不要慌乱。

早上准时起床,吃早饭,一切正常,不慌不乱……扛着一箱子书+模版,我们上三楼……八点半,比赛准时开始。

拿到题后按照之前的计划分工读题,我倒着,SXJ正着,MXD中间,很快MXD发现D题是热身赛我们做出的那道题目的三维扩展,于是我和SXJ一起做,SXJ继续读题。做到一半,MXD读到 B题,激动地喊出:梅森数!B的题意是给你一个<258的数n,让你判2^n+1是不是素数,这个就是梅森数……他想起了他的课本上有个表,找到 表,我打表上交……似乎judge出了点毛病,一直都没有判……期间,我和SXJ继续写D,写完上交,WA了……然后我发现一个低级错误修改后再交,依然 WA。同时MXD读题、观察全场,发现似乎没有别的题比较好做,于是我们三个人一同做D题,在此途中,我要求RejudgeB,返回AC……此时我和 SXJ继续做D题,MXD读题,观察场上,发现E题有人通过了。我们决定做完D题再看下一道。我们三个人通过讨论做出了D题。不得不感叹,学习要求甚 解……我们那道二维的猜出了结论,三维的就猜不出了……推了半天,接下来我们阅读E题,E题意是这样:长度70的150个子串,在一个10^6的母串里匹 配,问出现次数最多的串。大概两种想法,一种是KMP、Rabin-Karp系列的算法硬水,一种是SA。我们发现场上有十几个队伍通过了E题,估计不是 SA(SA不会普及成这样吧……),于是我照TC模版写了个KMP,交上去,TLE……我们觉得KMP系算法应该是超时的,于是我和MXD一起想E题的后 缀数组,SXJ继续读题,观察全场,发现其他题有队伍通过了,但是那些题都在我们能力范围之外……我们平时后缀数组写的就少,这时硬想心里也没底……眼看 Rank就掉出前60,要拿铁了……我们继续沉着冷静……讨论了半天,我想出了一个可能对的方法。我们决定再水一下,用别的KMP模版重写E题,如果不过 再用后缀数组搞下。SXJ重写了E题,提交后错误。由于TLE是优先于WA的,我们看到了希望……我注意到一个题目理解问题,如果答案是0,是输出所有串 还是不输出……询问了Judge,得到了一个不置可否的回答。SXJ按照另一种理解修改后通过。这时Rank45,之后我们讨论了其他问题,但是无所斩 获。封榜前Rank47,不拿铁的目标算是完成了……可惜我们WA太多,没能拿到Ag……

接下来一个小时完全进入牛校的Show Time,先是清华的队屡屡过题后狂喊:牛13!,然后是北大的队伍最后一分钟过题(那队真是慢热型,前3小时始终落后于我们,但是最后题该出的都出了……金牌第二……)

下午无聊……晚上颁奖,顺利拿到Cu……外加ICPC第30名的排名证书(那个证书只有前30才有……RP好啊)

晚上宴会,大吃一顿,然后回宾馆上网了……

总体来讲,我们没有失误,B题那个表是有点超常发挥了,发挥中规中矩。300铜500银1000金这个定律果然不假……我们的战斗力果然只有铜……

身 为菜鸟首秀,基本上可以满意……但是今年我们想要拿Ag,需要一些超常发挥,今后想要拿Au,就得向1000发展……任重而道远,不过我还年轻,还有很多 时间……看看TC上的红牛前几,前5中,楼爷基本是对数型增长……有的BT黄几次就红了,那些人的天赋我们是学不来的,要学就学7、8名之后那些人,人家 是练出来的。从绿挣扎到红,奋斗了两三年……

好在我才大一,还花的起这2~3年,Fight,Sweet!
posted @ 2010-08-21 15:46 sweetsc 阅读(138) | 评论 (0)编辑 收藏

诸位,Welcome~

前一阵一直在用人人……后来感觉还是要有个技术Blog……于是决定把这里复活……

我会主要在这里写一些关于ACM/ICPC、Topcoder、以及其它竞赛的文章
竞赛不是全部,我也会写一些感兴趣的相关技术……
尽管是在javablog,而且我本意很想写成java的,但是有时还是难免使用C++,因为在竞赛中使用java,有利也有弊……

从ACM界退休之后,更多的是认识到自己的不足:ACM竞赛尽管很有意义,但是也有其局限性……解题或者说解决问题固然重要,找到问题才是最重要的;
而且有好多问题,是在竞赛中遇不到的。于是我表示,为了快点跟上实验室主流的步伐,争取每天在Days的基础上,再写一篇技术Blog……
好吧,这每天一篇压力太大了……外加近日压力很大,主要是受到外界的压力,一个月一篇都无法保证……不过无论如何,我还是会刷题,继续学点算法知识,为人生第10个赛季,NKU -> HOT ENCORE做准备,在有参赛资格的情况下,我永远是NKU的ACM/ICPC contestant,会向着Au或许缓慢但是坚定的迈进……

近况神马的详见人人吧……
好好写日志,争取让读者们有所收获……
posted @ 2010-07-26 21:41 sweetsc 阅读(112) | 评论 (0)编辑 收藏

题目要求:
给出一个整数A,求它的B次幂的所有因数的和
(0 <= A,B <= 50000000)
样例:A=2,B=3,则答案是1+2+4+8=15
算法:
看到数据范围巨大,硬搞是不成的

根据唯一分解定理,A可以分解成一系列质数的幂的形式:
A=p1^a1 * P2^a2.....*Pn^an
(P1,P2……是质数)
所以,A^B=p1^(a1*B) * P2*(a2*B).....Pn^(an*B)
然后,A^B的因数,设某个因数为C,则C可以表示成
C=p1^c1 * p2^c2……* pn^cn
其中0<=ci<=ai*B
这样一来,给所有因数求和,就相当给所有形如C的数求和
接下来通过合并同类项,得到一个简洁的形式
sum=(1+p1+p1^2..+p1^(a1*B))(1+p2+p2^2...+p2^(a2*b)).....(1+pn+pn^2+....+pn^(an*B))
分别把每项中的等比数列求和算出相乘即可

这道题还有一个小Trick:
为了避免高精度计算,答案需要Mod9901输出,但是这导致直接应用(p^(n+1)-1)/(p-1)的公式进行等比数列求和行不通
因为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 阅读(1455) | 评论 (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
    要求将它们按字典序排序,并且统计每组记录的出现次数
    例如:
    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为基的基数排序+10000的计数排序

复杂度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 阅读(126) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4