这与数学有关,但是我在这里发布我的代码,因为似乎有一些错误让我不知所措。
问题:
两个机器人 A & B 站在位于无限长直线上的位置
0
上。机器人 A 可以通过 a 或 b 单位向左或向右移动,机器人 B 也可以执行相同,但由 c 或 d 单位。他们要按下位于该直线上的按钮,距离0
的距离不超过 k 。在多少个位置 p i 可以放置按钮,这样两个机器人都能够按下它(实际到达它),彼此独立。所以输入是1行中的5个正整数: a , b , c , d , ķ约束: 0 ≤ a,b,c,d,k ≤ 10 18 和数量测试用例 t 其中 1 ≤ t ≤ 1000 。
时间限制: 1秒
例如:机器人 A ( a = 1, b = 2),机器人 B ( c = 4, d = 5),范围: k = 1
本案的答案是 3 。
我想一个解释会使这个问题不必要地长,并偏离主要关注点。我正在给出我想出的解决方案并继续我的代码。
我的解决方案:
让 m = LCM(HCF( a , b ),HCF( c , d ))
答案= 2 * [ k / m ] + 1
[]表示最大的整数函数(只是为了避免混淆)。
简短说明(对于那些对此问题感兴趣的人),我所做的就是检查 k 范围内存在多少 m 在任何一方,加上 0 位置。 HCF(a,b)
将给出机器人可以采取的最短步骤,并且LCM
中的HCF
将给出他们可以站立的最小共同位置。然后找不到。倍数。
代码(C ++):
1 #include <cstdio>
3 using namespace std;
4 typedef long long LL;
5
6 inline void swap(LL *a, LL *b)
7 {
8 *a ^= *b;
9 *b ^= *a;
10 *a ^= *b;
11 }
12
13 long hcf(LL a, LL b)
14 { return !a || !b ? a+b : hcf(b,a%b); }
15
16 LL lcm(LL a, LL b)
17 {
18 if(a < b) swap(&a,&b);
19 LL i=a;
20 while(a%b) a+=i;
21 return a;
22 }
23
24 int main()
25 {
26 int t; scanf("%d\n",&t);
27 while(t--)
28 {
29 LL a,b,c,d,k;
30 scanf("%lld %lld %lld %lld %lld",&a,&b,&c,&d,&k);
31 printf("%lld\n", 1 + ((k / (lcm(hcf(a,b), hcf(c,d))) ) << 1) );
32 }
33 return 0;
34 }
我只是实现了我的答案。我还通过1000个测试用例执行了我的程序,每个测试用例包括[10 16 ,10 18 ]范围内的随机+整数。我这样做了多次,最坏的时间消耗是 0.01 秒。
现在,当我将此代码提交到比赛页面时,我收到Time Limit Exceeded
错误!这是不可能的,除非一些错误循环无休止地运行特定输入。我想我应该听取专家的意见,为什么我的代码会超时。请帮忙
P.S。:如果您对这个问题有更好的答案,欢迎您: - )
修改:PS:我对C++
中处理大整数的方式持怀疑态度,因此我转换为python
并提交了该文件,并再次提交Time Limit Exceeded
错误。
答案 0 :(得分:0)
您的代码中包含从scanf
读取的stdin
次来电。除非提供输入,否则它将无限期挂起。大多数竞赛都没有从stdin
读取您的代码。规则说的是输入的来源?
答案 1 :(得分:0)
请注意,此代码非常危险:
inline void swap(LL *a, LL *b)
{
/* sometimes also written as *a^=*b^=*a^=*b; */
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
如果a
和b
指向同一个内存,则会将该内存清零。
(尝试使用此交换来反转具有奇数个字母的字符串)
char* input = "abcde"
for(i=0, j=4; i<3; ++i, --j)
{
swap(input+i, input+j);
}
// Result: "ed0ba".
// With a normal-swap, 'c' would get swapped with 'c', returning "edcba"