【cf492】E. Vanya and Field(拓展欧几里得)

将每个点的横坐标都转换成0,然后找纵坐标有多少即可。。即解方程

a×dxx(modn)  a × d x ≡ x ( m o d n )

然后注意开long long

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

#include <map>

using namespace std;

typedef long long ll;

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define CC(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << (#x) << " = " << (x) << endl

#define error(x) (!(x)?puts("error"):0)

#define rdm(x, i) for(int i=ihead[x]; i; i=e[i].next)

inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }

 

const int N=1e6+10;

void exgcd(ll a, ll b, ll &d, ll &x, ll &y) {

    if(!b) { d=a; x=1; y=0; return; }

    exgcd(b, a%b, d, y, x); y-=a/b*x;

}

int n, m, c[N];

ll x, y, d, a, b, dx, dy;

int main() {

    cin >> n >> m >> dx >> dy;

    for1(i, 1, m) {

        cin >> x >> y;

        if(x==0) { c[y]++; continue; }

        exgcd(dx, n, d, a, b);

        if(x%d!=0) continue;

        a=(a+n)%n;

        a=(a*x)%n;

        x=((x-a*dx)%n+n)%n;

        y=((y-a*dy)%n+n)%n;

        c[y]++;

    }

    int mx=0, pos=-1;

    rep(i, n) if(c[i]>mx) pos=i, mx=c[i];

    //rep(i, n) dbg(c[i]);

    if(pos==-1) cout << x << ' ' << y << endl;

    else cout << 0 << ' ' << pos << endl;

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值