023 The Football Season (CF1244C)

  • 题目链接:CF1244C
  • 标签:数学 思维
  • 题意:
    解方程:
    x w + y d = p xw+yd=p xw+yd=p
    x + y + z = n x+y+z=n x+y+z=n
    其中:
    0 < n < 1 0 12 0 < n < 10^{12} 0<n<1012
    0 < p < 1 0 17 0< p < 10^{17} 0<p<1017
    0 < w < d < 1 0 5 0<w < d < 10^{5} 0<w<d<105
    以上各个数均为正整数,输出一组解,不存在则输出-1
  • 思路:此题题意简单,重点在于如何优化,因为此题给出的数据范围还是比较大的。笔者想出来的解法是,因为w比d大,想要在 x + y < = n x+y<=n x+y<=n范围内找到一组x,y满足题意,那y值应该要尽可能小,所以我们y从0开始枚举,到第一个令 p − y ∗ d p-y*d pyd可以被w整除的数为止。上界是w,因为 w ∗ d w*d wd必然是这两者的公倍数,倘若在这之前找不到满足条件的y,这之后也必找不到。之后验证x和z是否为正整数即可,代码如下:
  • 代码
#include<bits/stdc++.h>
using namespace std;
long long int n,p,w,d,x,y,z,t,i,j,k,l,r,mid;
int main(){
	cin>>n>>p>>w>>d;
	while(y<w&&(p-y*d)%w!=0) y++;
	if(y<w){
		x=(p-y*d)/w;
		z=n-x-y;
		if(x<0||z<0){cout<<-1;return 0;}
		cout<<x<<" "<<y<<" "<<z; 
	}
	else
	cout<<-1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值