济南-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\n",m-n+1-get(n,m,upper_bound(p+1,p+1+p[0],b)-p-1)); fclose(stdin); fclose(stdout); return 0; }
T3代码:
补上题目: