This is the logo of PKUACM 2016. More specifically, the logo is generated as follows:
1. Put four points A0(0,0), B0(0,1), C0(1,1), D0(1,0) on a cartesian coordinate system.
2. Link A0B0, B0C0, C0D0, D0A0 separately, forming square A0B0C0D0.
3. Assume we have already generated square AiBiCiDi, then square Ai+1Bi+1Ci+1Di+1 is generated by linking the midpoints of AiBi, BiCi, CiDi and DiAi successively.
4. Repeat step three 1000 times.
Now the designer decides to add a vertical line x=k to this logo( 0<= k < 0.5, and for k, there will be at most 8 digits after the decimal point). He wants to know the number of common points between the new line and the original logo.
In the first line there’s an integer T( T < 10,000), indicating the number of test cases.
Then T lines follow, each describing a test case. Each line contains an float number k, meaning that you should calculate the number of common points between line x = k and the logo.
For each test case, print a line containing one integer indicating the answer. If there are infinity common points, print -1.
3 0.375 0.001 0.478
-1 4 20
/*********************************************************************/
题意:以A0(0,0), B0(0,1), C0(1,1), D0(1,0)四个点组成的正方形,每次取边A0B0, B0C0, C0D0, D0A0的中点相连,能得到新的正方形,按此操作1000次,可以得到如图的标识
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<deque> #include<functional> #include<iterator> #include<set> #include<utility> #include<stack> #include<queue> using namespace std; #define maxn 22222 #define inf 1500000007 int main() { int i,j,k,n,m,T,p=1; int s; double x,y; scanf("%d",&T); while(T--) { scanf("%lf",&x); y = 0.25; s = 4; if(x == 0) { printf("-1\n"); continue; } while(1) { if(x == y) { s = -1; break; } if(x < y) break; y = (y + 0.5)/2; s = s + 4; } printf("%d\n",s); } return 0; }菜鸟成长记