CodeForces 492E Vanya and Field

题意:

n*n的矩形内有m(10^5)个点  从任一点开始以速度向量(dx,dy)移动  直到走到曾经走过的位置  问  从哪里开始  可以经过最多的点数  dx和dy均与n互素

思路:

很容易想到以dx,dy移动的话  走的一定是一个圈  不会是出现“蝌蚪形”然后循环  注意题意最后一句  而且每个x坐标一定只经过一次

那么对于m个点  我们可以求出它是(0,y)这个点可以到达的  求解方法就是用拓展欧几里德解下面方程

(x+dx*k)%mod=xi , (y+dy*k)%mod=yi 其中x=0 那么可以先解出k  把k带到二式解出y

最后统计对于每个(0,y)可以到达的点数就是答案

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<bitset>
using namespace std;
typedef long long LL;
#define N 2000010

int n, m, ans;
LL dx, dy, posy;
map<LL, int> cnt;

long long extend_gcd(long long a, long long b, long long &x, long long &y) {
    if (a == 0 && b == 0)
        return -1;
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    long long d = extend_gcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

int main() {
    cin >> n >> m >> dx >> dy;
    LL k, tmpk;
    extend_gcd(dx, n, k, tmpk);
    while (m--) {
        LL x, y;
        cin >> x >> y;
        if (x != 0) {
            tmpk = k * x % n * dy % n;
            if (tmpk <= y)
                y = y - tmpk;
            else
                y = y + n - tmpk;
        }
        y %= n;
        cnt[y]++;
        if (cnt[y] > ans) {
            ans = cnt[y];
            posy = y;
        }
    }
    cout << "0 " << posy << endl;
    return 0;
}
时间: 2024-11-08 03:14:52

CodeForces 492E Vanya and Field的相关文章

codeforces 492E. Vanya and Field(exgcd求逆元)

题目链接:codeforces 492e vanya and field 留个扩展gcd求逆元的板子. 设i,j为每颗苹果树的位置,因为gcd(n,dx) = 1,gcd(n,dy) = 1,所以当走了n步后,x从0~n-1,y从0~n-1都访问过,但x,y不相同. 所以,x肯定要经过0点,所以我只需要求y点就可以了. i,j为每颗苹果树的位置,设在经过了a步后,i到达了0,j到达了M. 则有 1----------------------(i + b * dx) % n = 0 2------

Codeforces 492E Vanya and Field(拓展欧几里得)

题目链接:Codeforces 492E Vanya and Field 通过拓展欧几里得算法求出每个位置在移动过程中,在x为0时,y的位置.统计相应y坐标最多的即为答案. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e6 + 5; const int maxm = 1e5 + 5; typedef long long l

Codeforces 492E Vanya and Field 规律题

题目链接:点击打开链接 给定n*n的矩阵(0,0)->(n-1, n-1) m个苹果(下面m行给出苹果坐标)(dx, dy) 向量. 任选一个起点,用这个向量在矩阵里跑,问最多能采摘多少个苹果(坐标是%n, 即超过矩阵时 (x%n, y%n)) 输出起点. 思路: 把向量所在的点集写出来会发现一个起点一定经过了n个点,即至多只有n种起点 所以把点分成n个组即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #in

Vanya and Field

Vanya and Field 题目链接:http://www.codeforces.com/problemset/problem/492/E 逆元 刚看到这题的时候一脸懵逼不知道从哪下手好,于是打表找规律.但是打出来的东西完全不能看啊,有个鬼规律(╯‵□′)╯︵┻━┻,是我数据处理不当?按x排序后发现从一个点出发可以到达任意一个x坐标,回过去看题,发现有这么一句话:The following condition is satisfied for the vector: ,恩,好像有点思路了.(

【CF492E】【数学】Vanya and Field

Vanya decided to walk in the field of size n × n cells. The field contains m apple trees, the i-th apple tree is at the cell with coordinates (xi, yi). Vanya moves towards vector (dx, dy). That means that if Vanya is now at the cell (x, y), then in a

CodeForces 552C Vanya and Scales

Vanya and Scales Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 552C Description Vanya has a scales for weighing loads and weights of masses w0, w1, w2, ..., w100 grams where w is some

CodeForces - 552E Vanya and Brackets

Vanya and Brackets Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Description Vanya is doing his maths homework. He has an expression of form , where x1, x2, ..., xn are digits from 1 to 9, and sign represents either a p

Codeforces 552E Vanya and Brackets(贪心 + 表达式计算)

题目链接 Vanya and Brackets 题目大意是给出一个只由1-9的数.乘号和加号组成的表达式,若要在这个表达式中加上一对括号,求加上括号的表达式的最大值. 我们发现,左括号的位置肯定是最左端或者某个乘号右边,右括号的位置肯定是最右段或者某个乘号左边. 而乘号最多只有15个,那么暴力枚举就可以了. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b);

codeforces 492C. Vanya and Exams 解题报告

题目链接:http://codeforces.com/problemset/problem/492/C 题目意思:给出 3 个整数:n,  r,  avg.然后有 n 行,每行有两个数:第 i 行有 ai 和 bi.表示如果写 bi 篇文章那么可以在 ai 这个分数上增加 1 分.可以增加好多次,但是前提是加完得到的分数不能超过 r.要使得 n 个exam 的分数平均分至少达到avg时需要写的最少文章是多少篇. 解决方法很简单,贪心即可. 我们当然希望写的文章越少越好,所以先对文章从小到大排序.