P1202 -- 金坷垃
时间限制:1000MS
内存限制:131072KB
Description
金坷垃,金坷垃,小麦亩产一千八。金坷垃,金坷垃,一袋能当两袋撒。某牛看准了金坷垃的光明前途,已经储存了整整一满仓的金坷垃,这个仓库能放下N的金坷垃。
日本资源太缺乏,非洲农业不发达,日本和非洲纷纷要求购入。为了避免被偷被抢,作为奸商的某牛,又另外租了两个容量分别为Q和P的仓库。他每次可以把一个仓库中的金坷垃不停地运到另一个仓库,直到目标仓库满了,或者当前仓库空了。他如此这番折腾了很多次。至于多少次,某牛自己也忘了。终于,某牛只知道,容量为Q的仓库终于是空了。那么现在,最初容量为N的那个仓库,可能会有多少金坷垃咧?(显然某些金坷垃已经直接或者间接地运到了容量为P的仓库)
Input Format
输入三个数Q,P,N。分别表示新租的两个仓库的容量和原来的仓库容量。
Output Format
输出一行,从小到大输出最初的仓库可能的金坷垃数量。(本题的金坷垃单位,全部为Kg)
Sample Input
8 9 10
Sample Output
1 2 8 9 10
Hint
30%:Q,P,N<=10
60%:Q,P,N<=100
100%:Q,P,N<=1000
【题解】无力吐槽题目
有点像倒油的搜索题
加上读入优化2.0竟然0.001s=-=不给我0s

1 #include<bits/stdc++.h> 2 using namespace std; 3 int q,p,n; 4 bool vis[1001][1001],ans[1001]; 5 char B[1<<15],*S=B,*T=B; 6 char getchar2() { 7 return S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++; 8 } 9 int read() { 10 int x=0,f=1; 11 char ch=getchar2(); 12 while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar2();} 13 while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar2();} 14 return x*f; 15 } 16 void f(int x,int y,int z) { 17 if(vis[x][y])return; 18 if(x==0)ans[z]=1; 19 vis[x][y]=1; 20 if(p-y>=x) f(0,x+y,z); 21 else f(x-p+y,p,z); 22 if(q-x>=y) f(x+y,0,z); 23 else f(q,y-q+x,z); 24 if(n-z>=x) f(0,y,x+z); 25 else f(x-n+z,y,n); 26 if(q-x>=z) f(x+z,y,0); 27 else f(q,y,z-q+x); 28 if(n-z>=y) f(x,0,y+z); 29 else f(x,y-n+z,n); 30 if(p-y>=z) f(x,y+z,0); 31 else f(x,p,z-p+y); 32 } 33 int main() { 34 q=read();p=read();n=read(); 35 f(0,0,n); 36 for (int i=0;i<=n;++i) if(ans[i]) printf("%d ",i); 37 return 0; 38 }