您的位置:首页 > 其它

济南-1103试题解题报告

2016-11-06 20:55 183 查看
济南-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) 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;
}


 

[b]T3代码:


 

[b]补上题目:[/b]















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: