Home >Web Front-end >HTML Tutorial >Codeforces Round #280 (Div. 2)_html/css_WEB-ITnose
This question is surprisingly simple
ABC is almost all sign-in questions
For D,
Convert the shooting time of two people into integers
Find a gcd and divide it.
Assume that the shooting frequency of the two people is 1 second x, 1 second y respectively
x, y’s gcd is g
Converting it is equivalent to
The first person shoots one shot at y/g seconds, and the second person shoots one shot at x/g seconds
Then the two people will shoot at the same time at x/g*y/g seconds
Then each x/g*y/g second is a cycle
Assume the monster’s blood has a, then a% (x y) is the blood volume to be shot in the last cycle
At this time, I am too lazy to continue thinking. Just halve the number of times someone shoots, and that’s it.
#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#include <map>#define MAXN 55555#define MAXM 222222#define INF 1000000001using namespace std;int n, x, y, a;int main() { scanf("%d%d%d", &n, &x, &y); int g = __gcd(x, y); x /= g; y /= g; for(int i = 0; i < n; i++) { scanf("%d", &a); a %= (x + y); if(a == 0 || (a + 1) % (x + y) == 0) puts("Both"); else { int flag = 0; int low = 1, high = x; while(low <= high) { int mid = (low + high) >> 1; long long tmp = (long long)mid * (long long)y; long long z = tmp / (long long)x; if(z + mid > a) { high = mid - 1; } else if(z + mid == a) { flag = 1; break; } else { low = mid + 1; } } if(flag) { puts("Vanya"); } else { puts("Vova"); } } } return 0;}
If E
the question gives a good limit
that is, from the x direction or the y direction, you start from Start walking at 0 and walk n steps. You will definitely be able to traverse all 0~n-1
. Then you simulate walking n steps from 0 in the x direction and get an x coordinate sequence
y Coordinates do the same thing
two sequences. They are all cyclic
Then you choose to start from a certain point (x0, y0)
It is nothing more than two sequences, the x sequence starts from x0, and the y sequence starts from y0, Each took n steps to see which points met the requirements of the question
Looking again, I found that it was nothing more than looking at the relative positions of the two sequences.
For all given points, calculate the relative positions of the two corresponding sequences, and finally count
#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#include <map>#define MAXN 55555#define MAXM 222222#define INF 1000000001using namespace std;int posx[1111111], posy[1111111];int n, m, dx, dy;int x[111111], y[111111];int num[1111111];int main() { scanf("%d%d%d%d", &n, &m, &dx, &dy); int now = 0; int ind = 0; while(posx[now] == 0) { posx[now] = ++ind; now = (now + dx) % n; } now = 0, ind = 0; while(posy[now] == 0) { posy[now] = ++ind; now = (now + dy) % n; } int mx = 0, p = 0; for(int i = 0; i < m; i++) { scanf("%d%d", &x[i], &y[i]); int px = posx[x[i]]; int py = posy[y[i]]; int t = (py - px + n) % n; num[t]++; if(num[t] > mx) { mx = num[t]; p = t; } } for(int i = 0; i < m; i++) { int px = posx[x[i]]; int py = posy[y[i]]; int t = (py - px + n) % n; if(t == p) { printf("%d %d\n", x[i], y[i]); break; } } return 0;}