CodeChef November Challenge 2013 部分题解

http://www.codechef.com/NOV13 还在比...我先放一部分题解吧...

Uncle Johny 排序一遍

struct node{
    int val;
    int pos;
}a[MAXN];
int cmp(node a,node b){
    return a.val < b.val;
}
int main(){
    int T,n,m;
    while(cin>>T){
        while(T--){
            cin>>n;
            for(int i = 0 ; i < n ; i++){
                cin>>a[i].val;
                a[i].pos = i+1;
            }
            cin>>m;
            sort(a,a+n,cmp);
            for(int i = 0 ; i < n ; i++){
                if(a[i].pos == m){
                    cout<<i+1<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}

Missing some chairs 简单快速幂

LL pow_mod(LL a, LL b){
    if(b == 1) return a;
    LL x = pow_mod(a,b/2),ret;
    if(b&1){
        ret = ((x * x)%MOD * a) % MOD;
    }else ret  = (x * x) % MOD;
    return ret;
}
int main(){
    int T;
    cin>>T;
    while(T--){
        LL n;
        cin>>n;
        LL c = pow_mod(2,n);
        cout<<c-1<<endl;
    }
    return 0;
}

Yet Another Cute Girl

因子个数为素数的可能只有可能是pi^(pj-1)次幂..其中p是素数

对于pj=2,区间素数筛,筛到sqrt(N)就行了...有O(n)的做法但我懒得写...其他的情况直接处理[L,R]内pi^(pj-1)的个数,加起来即可...

考虑到pow可能爆LL,这个很坑..我应该是卡过的...

LL cnt;
bool prime[MAXN];
LL pri[MAXN];
bool p[MAXN];
LL L,R;
void pre_prime(){
    cnt = 0;
    prime[0] = prime[1] = 1;
    for(int i = 2 ; i < MAXN ; i++){
        if(!prime[i]) pri[cnt++] = i;
        for(int j = 0 ; j < cnt && i * pri[j] <= MAXN ; j++){
            prime[i * pri[j]] = 1;
            if(i % pri[j] == 0) break;
        }
    }
}
LL mpow(LL a, LL b){
    LL ret = 1;
    for(LL i = 0 ; i < b ; i++){
        LL tmp = ret * a;
        if(tmp > LINF || tmp < ret) return -1;
        ret = tmp;
    }
    return ret;
}
LL solve(){
    LL ct = 0;
    mem(p,0);
    for(LL i = 1 ; i < cnt ; i++){
        for(LL j = 0 ; j < cnt ; j++){
            LL q = mpow(pri[j],pri[i]-1);
            if(q == -1) break;
            if(q >= L && q <= R){
                ct++;
            }
        }
    }
    for(LL j = 0 ; j < cnt ; j++){
        LL i;
        L % pri[j] == 0 ?  i = L : i = (L/pri[j]+1)*pri[j];
        if(i < MAXN && prime[i] == 0) i = i*2;
        for(i ; i <= R ; i+=pri[j]) p[i-L] = true;
    }
    for(LL i = L ; i <= R ; i++){
        if(p[i-L] == false && i != 1){
            ct++;
        }
    }
    return ct;
}
int main(){
    pre_prime();
    int T;
    cin>>T;
    while(T--){
        cin>>L>>R;
        LL res = solve();
        cout<<res<<endl;
    }
    return 0;
}

Square Digit Squares 预处理一遍完全平方数,就没多少个

LL a[MAXN];
int cnt = 0;
bool judge(LL x){
    while(x){
        LL y = x%10;
        if(y != 1 && y != 0 && y != 4 && y != 9) return false;
        x/=10;
    }
    return true;
}
void pre(){
    for(LL i = 1 ; i*i <= (LL)pow((LL)10,(LL)10)+50 ; i++){
        if(judge(i*i)){
            a[cnt++] = i*i;
        }
    }
}
int main(){
    pre();
    int T;
    cin>>T;
    while(T--){
        LL ax,bx;
        cin>>ax>>bx;
        int ct = 0;
        for(int i = 0 ; i < cnt ; i++)
            if(a[i] >= ax && a[i] <= bx) ct++;
        cout<<ct<<endl;
    }
    return 0;
}

 

Superpowers of 2 还是幂取模,一套题出两次我就不吐槽了,也许LL会WA

ULL change(ULL a){
    ULL ret = 0;
    int p[100],cnt = 0;
    while(a){
        p[cnt++] = a%2;
        a/=2;
    }
    for(int i = cnt-1 ; i >= 0 ; i--){
        ret = ret * 10 + p[i];
    }
    return ret;
}
ULL pow_mod(ULL a, ULL b){
    if(b == 1) return a;
    ULL x = pow_mod(a,b/2),ret;
    if(b&1) ret = ((x * x)%MOD * a) % MOD;
    else ret  = (x * x) % MOD;
    return ret;
}
int main(){
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        ULL x = pow_mod(2,change(n));
        cout<<(x*x)%MOD<<endl;
    }
    return 0;
}

 

posted @ 2013-11-08 17:27  Felix_F  阅读(330)  评论(1编辑  收藏  举报