济南-1103试题解题报告

济南-1103试题解题报告

By shenben

上午

T1代码:

 

#include<cstdio>
#include<cstring>
using namespace std;
unsigned int p,z,n,v[66000];
char c;
#define name "ab"
int main(){
    for(int l=1;;l++){
        memset(v,0,sizeof v);
        freopen(name".in","r",stdin);
        for(p=0,z=(1u<<l)-1,c=getchar();c>32;c=getchar(),n++){
            p=((p<<1)|(c=='B'))&z;
            if(n>l) v[p/32]|=1u<<(p%32);
        }
        for(p=0;p<(1<<l);p++){
            if(!(v[p/32]>>(p%32)&1)){
                freopen(name".out","w",stdout);
                for(int i=l;i;i--) putchar('A'+(p>>(i-1)&1));
                return 0;
            }
        }
    }
    return 0;
}
/*
//copy from ylf's AC code
//答案很短 很短
//直接搜 不过 检验的时候很慢...
//预处理所有的子串 存好了就可以O(1)的检验了
//因为只有AB 可以用位运算优化 
#include<cstdio>
#include<cmath>
#include<cstring>
#define maxn (1<<22)+10
using namespace std;
int n,m,f[maxn],sum,falg,ans;
char s[maxn];
void dfs(int now,int x){
    if(falg) return;
    if(now==sum+1){
        if(f[x]==0){
            ans=x;falg=1;
        }
        return;
    }
    dfs(now+1,x);
    dfs(now+1,x+(1<<now-1)); 
}
int main(){
    freopen("ab.in","r",stdin);
    freopen("ab.out","w",stdout);
    scanf("%s",s);
    n=strlen(s);m=log(n)/log(2)+1;
    for(int i=0;i<n;i++){
        int x=0;
        for(int j=1;j<=m;j++){
            if(i+j-1>n) break;
            if(s[i+j-1]=='B') x+=(1<<j-1);
            f[x+(1<<j)]=1;
        }
    }
    for(sum=1;sum<=m;sum++){
        dfs(1,1<<sum);
        if(falg) break;
    }
    for(int i=0;i<sum;i++) printf(ans&(1<<i)?"B":"A");
    fclose(stdin);
    fclose(stdout);
    return 0;
}
*/

 

 

T2代码:

//评测时需要额外开栈 
#pragma comment(linker,"/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e6;
bool pd[N+1];
int p[N+1],c[N+1];
int maxc(int x){
    if(x<=N)return c[x];
    int ans=x;
    for(int i=1;p[i]*p[i]<=x;i++)
    if(x%p[i]==0){while(x%p[i]==0)x/=p[i];ans=p[i];}
    return max(ans,x);
}
int get(int x,int y,int b){
    if(x>y) return 0;
    if(b==0) return x==1;
    if(y<=p[b]) return y-x+1;
    if(x==y) return maxc(x)<=p[b];
    return get(x,y,b-1)+get((x-1)/p[b]+1,y/p[b],b);
}
int main(){
    freopen("prime.in","r",stdin);
    freopen("prime.out","w",stdout);
    int n,m,b;
    scanf("%d%d%d",&b,&n,&m);
    c[1]=1;
    for(int i=2;i<=N;i++){
        if(!pd[i])p[++p[0]]=i,c[i]=i;
        for(int j=1,t;j<=p[0]&&(t=p[j]*i)<=N;j++){
            pd[t]=1;
            c[t]=max(c[i],p[j]);
            if(i%p[j]==0)break;
        }
    }
    printf("%d
",m-n+1-get(n,m,upper_bound(p+1,p+1+p[0],b)-p-1));
    fclose(stdin);
    fclose(stdout);
    return 0;
}

 

T3代码:

 

补上题目:

 

原文地址:https://www.cnblogs.com/shenben/p/6036333.html