S2_I_Marathon

本文介绍了一种算法,用于计算马拉松运动员在正方形赛道上跑步时,每隔一定距离的精确坐标位置。该算法考虑了精度问题,并提供了详细的解决方案和代码示例。

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;
}
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值