Marathon
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Valera takes part in the Berland Marathon. The marathon race starts at the stadium that can be represented on the plane as a square whose lower left corner is located at point with coordinates (0, 0) and the length of the side equals a meters. The sides of the square are parallel to coordinate axes.
As the length of the marathon race is very long, Valera needs to have extra drink during the race. The coach gives Valera a bottle of drink each d meters of the path. We know that Valera starts at the point with coordinates (0, 0) and runs counter-clockwise. That is, when Valera covers a meters, he reaches the point with coordinates (a, 0). We also know that the length of the marathon race equals nd + 0.5 meters.
Help Valera’s coach determine where he should be located to help Valera. Specifically, determine the coordinates of Valera’s positions when he covers d, 2·d, …, n·d meters.
Input
The first line contains two space-separated real numbers a and d (1 ≤ a, d ≤ 105), given with precision till 4 decimal digits after the decimal point. Number a denotes the length of the square’s side that describes the stadium. Number d shows that after each d meters Valera gets an extra drink.
The second line contains integer n (1 ≤ n ≤ 105) showing that Valera needs an extra drink n times.
Output
Print n lines, each line should contain two real numbers x**i and y**i, separated by a space. Numbers x**i and y**i in the i-th line mean that Valera is at point with coordinates (x**i, y**i) after he covers i·d meters. Your solution will be considered correct if the absolute or relative error doesn’t exceed 10 - 4.
Note, that this problem have huge amount of output data. Please, do not use cout stream for output in this problem.
Examples
input
Copy
2 5
2
output
Copy
1.0000000000 2.0000000000
2.0000000000 0.0000000000
input
Copy
4.147 2.8819
6
output
Copy
2.8819000000 0.0000000000
4.1470000000 1.6168000000
3.7953000000 4.1470000000
0.9134000000 4.1470000000
0.0000000000 2.1785000000
0.7034000000 0.0000000000
题目大意
有一个正方形的运动场,边长为a,一个人从原点开始,逆时针跑。求出每次跑d米的坐标。
题目分析
其实是一道很简单的水题……然后很神经质的卡在了这里。主要是精度的问题吧。不过还是基础不是很扎实,卡在了几个奇奇怪怪的地方。
先说说自己踩了什么坑吧。
首先double
输入的确是用的是"%lf",而输出用的是"%f"。这个是没问题的。
错是错在了输出的0的时候,用%lf输出0是不对的,要填0.0(直接在双引号里面打0不就好了)……在这里wa了几发了,超级傻逼。
再然后,浮点数取模,emmm虽然时候听大佬们说有fmod这种东西,可是为什么我事后用fmod还是过不了……
我是直接实现了一个。
long long k = (double) i * d / a;
double t = (double) i * d - k * a;
t就是余数。还有就是这道题n,d的范围是1e5。相乘就是1e10,int就爆了,卡了这一手我心态爆炸。
所以下面是水水的题目分析。
对于每一倍的d,都对a做除法与取模,然后模数对应一下几种情况:
if(k == 0)
printf("%f %f\n", t, 0.0);
else if(k == 1)
printf("%f %f\n", a, t);
else if(k == 2)
printf("%f %f\n", a - t, a);
else if(k == 3)
printf("%f %f\n", 0.0, a - t);
代码
#include <cstdio>
using namespace std;
int main(int argc, char const *argv[]) {
double a, d;
int n;
scanf("%lf%lf%d", &a, &d, &n);
for(int i = 1; i <= n; i++){
long long k = (double) i * d / a;
double t = (double) i * d - k * a;
k %= 4;
if(k == 0)
printf("%f %f\n", t, 0.0);
else if(k == 1)
printf("%f %f\n", a, t);
else if(k == 2)
printf("%f %f\n", a - t, a);
else if(k == 3)
printf("%f %f\n", 0.0, a - t);
}
return 0;
}