[考试反思]0904NOIP模拟测试37:守望
100分并列的还有4个没粘
总分是大脸的一半,然而还只低了2名。差距好大。。。但其实后面的分数段又很密集,和我都差不了多少。。。
我可能也是最水的那一个,排行榜前7个里面就我没有AC。全是暴力。。。
这次考试的时间分配有点问题,要记录一下。
上来过了一边题目,T2的70分很好拿但是100分的暂时没有想出来,T1暴力只有30~60。
但是T3很不一样,像一个极其简单的dp,基本上没有思维量。
于是决定先入手T3,当我码上1k以上的时候我就知道这题没那么简单(考场上我的代码基本不上k)
一个小时过去了,我码完了但是调不过样例。没太着急,继续慢慢调。
8点的时候,我再次意识到了事态的严重性。100分钟一分没拿,有点危险了。
但是它已经出现了要过样例的迹象,我最后还是没有选择放弃。
最后在开考后128分钟我总算过了样例以及几个手模点,交了,长舒了一口气。
这倒是为数不多的在考场上交了长达1.6k的代码还没爆零。
但其实很危险,如果我觉得T3简单的话,那么如果T1T2难的话,剩的那么点时间岂不是要完蛋???
然而幸亏暴力不是很难。感觉还是T2比较简单,对着式子看了半天找到了规律,正准备AC。
然后这才600B的小玩意极其好打,匆匆忙忙23分钟搞定了。
1 #include<cstdio> 2 #define mod 1000003 3 #define int long long 4 int pow(int b,int t,int a=1){for(;t;t>>=1,b=b*b%mod)if(t&1)a=a*b%mod;return a;} 5 int n,m,fz=1,cts,fm; 6 main(){ 7 scanf("%lld%lld",&n,&m);int pm=m-1,cnt=0; 8 while(pm)pm>>=1,cnt++; 9 if(cnt>=n){puts("1 1");return 0;} 10 if(m>=mod)goto spj; 11 for(int i=1;i<m;++i){ 12 int cnt=0; 13 for(int p=2;i%p==0;p<<=1,++cnt); 14 int j=i>>cnt;cts+=cnt; 15 fz=fz*(pow(2,n-cnt)-j)%mod; 16 }fm=pow(2,(n%(mod-1)*(m-1)-cts+mod-1)); 17 printf("%lld %lld\n",(fm-fz)%mod,fm);return 0; 18 spj:for(int p=2;p<m;p<<=1)(cts+=(m-1)/p)%=(mod-1); 19 printf("0 %lld\n",pow(2,n%(mod-1)*(m-1)-cts+mod-1)); 20 }
错误很明显:分子减分母得到了负数然而没有+mod。而spj部分虽然式子里分子的确是0但是还要拿1减一下所以分子等于分母!
两个问题各丢了30分,剩下40。没时间检查没时间对拍。这时候是还有45分钟。
然后去T1,感觉不是很好做,时间又是很紧迫,还想稍微检查一下不要低错。
呼吸急促,8分钟打了一个600B的30分的纯暴力。
然后忽然想到优化,算错了复杂度,以为是O(n)的(实际是n2),10分钟码完,700B的代码有50分了。
然后还有20分钟左右。
然后我以为我能AK了。
我当时是真的这么想的:T1O(n)稳了,T2的100%数据也都会,T3手模各种毒瘤数据都没错。
然后不能飘不能飘。急忙打了一个对拍弄T1,没问题(还是没有考虑复杂度)
T2把样例扔进去没出锅,因为手模大点也不知道正解所以放过了(随便模两个就出负数了啊啊啊)
T3继续手模样例,还有7分钟时挂了一个,改了,再交,用10分盖掉了30分。
还有2分钟是又挂了一个,再改,再交,用30分又盖回来了。
然后就结束了。
这次关键就在于时间。T3吃掉了太多时间导致T1T2低错不断。
复杂度算错这种事情直接葬送了我去想正解的想法。
一定不要在其他题的能拿的分数都拿到的情况下,在一道题上肝超过80分钟!
还是要注意细节,不要因为想到思路就松懈了导致代码实现出锅。
打题之前一定要仔细分析思路的复杂度,要有准确的期望得分。
唉。。。还是太弱,什么毛病都犯。
也许是好事吧,毕竟这60多天就是用来犯错改正长记性的嘛。。。