CF1244C: The Football Season

CF1244C:The Football Season

题意描述:

  • 给定(n,p,w,d),求(x*w+y*d==p)
  • ((x+y)<=n)
  • 数据范围:
    • ((1leq nleq10^{12},0leq pleq10^{17},1leq dleq wleq10^5))

思路:

  • 求解目标: (x*w+y*d=p)

  • 考虑存在一组解

    • [left{ egin{array} =x_0 \y_0=k*w+v(0<v<w)\ end{array} ight. ]

  • 则有

    • (x_0*w+y_0*d=p)
    • (x_0*w+(k*w+v)*d=p)
    • (x_0*w+k*d*w+v*d=p)
    • ((x_0+k*d)*w+v*d=p)
  • 所以存在一组解

    • [left{ egin{array} =x=x_0+k*d \y=v\ end{array} ight. ]

  • 并且由于(w>d)

    • (x+y=x_o+k*d+v<x_0+k*w+v)
  • 前者比后者更可能成为答案

  • (x+y)更有可能小于等于(n)

  • 所以直接枚举所有的(v)就好,又因为((0<v<w)),所以最多枚举(1e5)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, p, w, d;
int main()
{
    cin >> n >> p >> w >> d;
    for(ll y = 0, x; y < w; y++){
        if((p-d*y)%w==0) x = (p-d*y)/w;
        if(x >= 0 && x + y <= n){
            cout << x << " " << y << " " << n-x-y << endl;
            return 0;
        }
    }
    puts("-1");
    return 0;
}
原文地址:https://www.cnblogs.com/zxytxdy/p/11670509.html