码迷,mamicode.com
首页 > 其他好文 > 详细

CQOI2015 选数+酱油记

时间:2015-04-10 21:45:46      阅读:1118      评论:0      收藏:0      [点我收藏+]

标签:

昨天我们考了CQOI2015的题。。那还是找一道最可做的写一写好了>.<。。

考试的结果还是不多说了。。反正我是知道暴力乱搞高精度的重要性了。。骗分的OI才有随机性才好玩,嘛。。。

成绩不忍直视但竟然还没出前三。。感人肺腑。。。

怎么觉得自从看了CLJ犇的Blog之后越来越喜欢模仿他们的语气卖萌了呢~~

还是总结一下考试好了,嗯。。。

感觉我考的时候还是不太在状态。。然后有的题目想出来了之后就不太想打了= =。。然后四处duang啊duang。。时间一下子就过去了呢>.<

根据C老师的经验嘛,考前喝咖啡效果极佳。。下次试试。。哎好像就是明天了。。

我发现我不是在写题解是在扯谈诶。。本来就是在扯淡。。

那还是说题目吧,问题自己找→_→

打的思路很快就有了,算出所有可能是约数是K的然后再减去不是最大公约数的就可以了。。、

然后怎么做呢。。冥冥之间我想到了NOI能量采集,但记不太清了。。那还是算了吧。。

唯一分解定理真是印象深刻。。于是我决定用素数搞一搞。。

自己出了2 1 1 10这组数据,发现和暴力拍出来不太一样啊。。那怎么办呢。。手动算一算好了。。

然后发现2的时候算了6、3的时候也算了6,多减了。。那怎么办呢。。加回来好了。。哎怎么觉得这么像容斥原理呢。。想想好像真的是耶~~

getprime到R/K,然后再开容斥原理就好了,深搜一下,*啊*,当然超过R/K停止就可以了,算一下[L,R]是它倍数的有多少。。然后奇-偶+就好了。。

关于算是它的倍数有多少。。考试的时候写得非常不优美。。再次怀疑我的智商。。

搜的时候差点准备…了,幸好突然清醒了一下。。

那么这么做是80分,如果K很小L很大就炸掉了。。

#include<cstdio>
#define ll long long
//#define uint unsigned int
int p[1001000]={0},P=0,ans=0;
int N,K,L,H,mod=1000000007,fx;
bool mark[10001000]={0};
void getpri(int L){
    for(int i=2;i<=L;i++)
    if(!mark[i]){
        p[++P]=i;
        for(long long j=i*i;j<=L;j+=i) mark[j]=1;
    }
}
int ksm(int x,int k){
    if(k==0) return 1;
    if(k==1) return x;
    ll ans=ksm(x,k/2);
    return (ans*ans%mod*ksm(x,k%2))%mod;
}
void count(int x,int T){
    fx=T%2==0?1:-1;
    int S=L+(x-L%x); if(S==L+x) S-=x;
    ans+=fx*ksm((H-S)/x+1,N);
    ans%=mod;
}
void search(int k,int x,int sum){
    count(sum,k);
    for(int i=x+1;i<=P;i++){
        if((long long)sum*p[i]>H) return;
        search(k+1,i,sum*p[i]);
    }
}
int main(){
    scanf("%d%d%d%d",&N,&K,&L,&H);
    getpri(H/K);
    count(K,0);
    for(int i=1;i<=P;i++)
        search(1,i,p[i]*K);
    printf("%d",ans>=0?ans:ans+mod);
    return 0;
}

真的是非常丑陋。。见笑了>.<。。发现我竟然用的是k(uai)s(u)m(i),以后还是打pow好了。。

考完之后,怎么觉得能量采集好像是对的啊。。然后搜了搜标解,真的是能量采集啊。

f[i]表示正好约数是i的个数,倒着求,减去f[x*i],x>1&&x∈N。。正确性自己感悟吧。。

想想竟然是一道以前做过的竟然没搞出来sososad。。当时啊没仔细感悟抄了题解A了就放一边了。。以后还是不能这样了呢>.<

至于题解的代码。。有一些部分感觉十分hehe。。还是不说了>.<

不过题解pow求法简直棒极了~~不用递归呢~~以后就用它了~~~

 1 #include<cstdio>
 2 #define SF scanf
 3 #define PF printf
 4 int f[100100]={0},MOD=1000000007;
 5 int pow(int x,int k){
 6     int ans = 1;
 7     while(k) {
 8         if(k&1) ans=1LL*ans*x%MOD;
 9         x=1LL*x*x%MOD;
10         k>>=1;
11     }
12     return ans;
13 }
14 int main(){
15     int N,K,L,R;
16     SF("%d%d%d%d",&N,&K,&L,&R);
17     int l=L/K,r=R/K;
18     if(L%K) l++;
19     int a,b;
20     for(int i=r;i>=1;i--){
21         a=l/i; b=r/i;
22         if(l%i) a++;
23         f[i]=pow(b-a+1,N);
24         for(int j=2*i;j<=r;j+=i) f[i]-=f[j],f[i]%=MOD;
25     }
26     PF("%d",f[1]>=0?f[1]:f[1]+MOD);
27     return 0;
28 }

没搞清的。。这样做K小H大也会爆炸呢。。

然后H-L<10^5用意何在。。出题人范逗么。。害我纠结好久。。

卡了这个暴力就卡不了那个暴力。。所以虽然算法有一定缺陷。。一般也就卡一两个点。。RP好还能A呢。。

扯了好多淡这题就这样好了>.<

其他的几道题呢。。还有点伤感。。这次真的是没打成一点暴力。。本想着最后打也不迟。。结果根本搞不过来。。还有某到算法很裸的,没打高精度,本来想着50分应该差也差不多呢。。结果10分滚粗。。

且说某Z纯暴力第3题AC,结果偏偏这题我没打。。真的一切的一切都说不定呢。。怎么突然觉得又有点悲伤又有点好玩呢>w<

还有一道网络流的,还是绕道而行好了,还有一道记忆化搜索,晃着晃着没时间打了。。

看了看高二考试的成绩。。发现绝大多数的真的没想象中的厉害呢。。

顺便突然发现暴力打好名次肯定不会太差呢。。所以不要有什么压力呢。。

明天就可以高一高二联考了。。不错的机会呢,试试XD

还有些自己想想就好了懒得打出来。。

其实没必要想那么多“终日之思不如须臾之所学”嘛。。

>.< >.< >.<

CQOI2015 选数+酱油记

标签:

原文地址:http://www.cnblogs.com/xkui/p/4415619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!