[bzoj5027][exgcd][乱搞]数学题

2023-10-16 03:38

本文主要是介绍[bzoj5027][exgcd][乱搞]数学题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

给出a,b,c,x1,x2,y1,y2,求满足ax+by+c=0,且x∈[x1,x2],y∈[y1,y2]的整数解有多少对?

Input

第一行包含7个整数,a,b,c,x1,x2,y1,y2,整数间用空格隔开。 a,b,c,x1,x2,y1,y2的绝对值不超过10^8。

Output

输出整数解有多少对?

Sample Input

1 1 -3 0 4 0 4

Sample Output

4

题解

真是失了智写的什么辣鸡..
ex随便搞出一组解
然后瞎移范围
欢快re
拍了一晚上没出错
发现
我对拍没出0的情况..
然后被A=0或者B=0卡了一晚上.

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define LL long long
#define mx 200000000
using namespace std;
LL exgcd(LL a,LL b,LL &x,LL &y)
{if(a==0){x=0;y=1;return b;}else{LL tx,ty;LL d=exgcd(b%a,a,tx,ty);x=ty-(b/a)*tx;y=tx;return d;}
}
LL A,B,C,K;
LL u1,u2,v1,v2;
int main()
{scanf("%lld%lld%lld%lld%lld%lld%lld",&A,&B,&C,&u1,&u2,&v1,&v2);if(u1>u2||v1>v2){printf("0\n");return 0;}if(!A&&!B){if(C==0)printf("%lld\n",(LL)(u2-u1+1)*(v2-v1+1));else printf("0\n");return 0;}K=-C;LL x,y;if(A==0){if(K%B){puts("0");return 0;}if(K/B>=v1&&K/B<=v2)printf("%lld\n",u2-u1+1);else puts("0");return 0;}if(B==0){if(K%A){puts("0");return 0;}if(K/A>=u1&&K/A<=u2)printf("%lld\n",v2-v1+1);else puts("0");return 0;}LL d=exgcd(A,B,x,y);if(K%d!=0){printf("0\n");return 0;}x=(x*(K/d));
//  printf("%lld\n",(K-A*x)/B);if(x>u2){LL gg=abs(B/d),dis=x-u1;//相邻可行x相距的长度if(gg==0){printf("0\n");return 0;}x=x-(dis/gg)*gg;}else if(x<u1){LL gg=abs(B/d),dis=u2-x;if(gg==0){printf("0\n");return 0;}x=x+(ceil(double(dis/gg)))*gg;gg=abs(B/d),dis=x-u1;x=x-(dis/gg)*gg;}else{LL gg=abs(B/d),dis=x-u1;if(gg!=0)x=x-(dis/gg)*gg;}if(x>u2||x<u1){printf("0\n");return 0;}y=(K-A*x)/B;LL ln1=abs(A/d),ln2=abs(B/d);//相邻可行y相距的长度 相邻可行x相距的长度LL u=x+ln2;LL v=(K-A*u)/B;int op;if(v<y)op=0;//y随着x增大而减小 else op=1;//增大而增大if(op==0)//减小 {if(y<v1){printf("0\n");return 0;}if(y>v2){if(ln1==0){printf("0\n");return 0;}LL ad1=ceil(double(y-v2)/double(ln1)),ad2=(u2-x)/ln2;if(ad1>ad2){printf("0\n");return 0;}y=y-ln1*ad1;x=x+ln2*ad1;}if(y<v1||y>v2){printf("0\n");return 0;}LL can_go=min((ln2==0?999999999:(u2-x)/ln2),(ln1==0?999999999:(y-v1)/ln1));printf("%lld\n",can_go+1);}else{if(y>v2){printf("0\n");return 0;}if(y<v1){if(ln1==0){printf("0\n");return 0;}LL ad1=(v2-y)/ln1,ad2=(u2-x)/ln2;y=y+ln1*ad1;LL gg1=(y-v1)/ln1;y=y-ln1*gg1;ad1-=gg1;if(ad1>ad2){printf("0\n");return 0;}x=x+ln2*ad1;}if(y<v1||y>v2){printf("0\n");return 0;}LL can_go=min((ln2==0?999999999:(u2-x)/ln2),(ln1==0?999999999:(v2-y)/ln1));printf("%lld\n",can_go+1);}return 0;
}

这篇关于[bzoj5027][exgcd][乱搞]数学题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218758

相关文章

数学题--2860. 让所有学生保持开心的分组方法数

2860. 让所有学生保持开心的分组方法数 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,其中 n 是班级中学生的总数。班主任希望能够在让所有学生保持开心的情况下选出一组学生: 如果能够满足下述两个条件之一,则认为第 i 位学生将会保持开心: 这位学生被选中,并且被选中的学生人数 严格大于 nums[i] 。这位学生没有被选中,并且被选中的学生人数 严格小于 nums[i]

P1516 青蛙的约会(exgcd)

一些前置知识: 1.扩展欧几里得算法:                                          ax+by=gcd(a,b) 方程一个可行的解(x1,y1)求法: int exgcd(int a,int b,int &x,int &y){if(!b){x=1,y=0; return a;}int d=exgcd(b,a%b,y,x);y-=a/b*x;ret

最常用的SAT数学题解答方法分享

下面为大家总结的是一些最常见的SAT数学题的解答方法。SAT数学题的备考对于中国考生来说难度不是很大,但是如果能够掌握更多的方法,会让大家的答题效果更好,正确率也更高。下面我们来看看详细内容吧。   1. 代入法-----------最常见的方法,适用于所有数学题目,只要是答案中有确切的数目。   例题:If x and y are two different integers and t

【数学题-递推找规律】BNU 4225 杨辉三角形

【题目链接】click here~~ 【题目大意】 LZM 同学比较牛, Lsy 最近也越来越生猛,他们思路快,代码速度神勇。近期惊闻此二人均要参加校赛,队里决定出些题目卡他们,因为他们的罢工给题目组留下了繁重的负担……(报复报复) 于是, XsugarX 瞄准了 LZM 不太喜欢看的数学题目以及 Lsy 猜公式的喜好,奸笑中( ^.^ )。这个数学问题是个比较古老的问题,有如下

洛谷 P10584 [蓝桥杯 2024 国 A] 数学题(整除分块+杜教筛)

题目 思路来源 登录 - Luogu Spilopelia 题解 参考了两篇洛谷题解,第一篇能得出这个式子,第二篇有比较严格的复杂度分析 结合去年蓝桥杯洛谷P9238,基本就能得出这题的正确做法 代码 #include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<map>#include<uno

nyoj-291-LK的数学题

//法一 #include<stdio.h> int eular(int n) {     int i,m=1;     for(i=2;i*i<=n;i++)     if(n%i==0)     {         n/=i;         m*=i-1;         while(n%i==0)         {             n/=i;             m*=i;

【C++题解】1265. 爱因斯坦的数学题

问题:1265. 爱因斯坦的数学题 类型:简单循环 题目描述: 爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨 2 阶,则最最后剩一阶,若每步跨 3 阶,则最后剩 2 阶,若每步跨 5 阶,则最后剩 4 阶,若每步跨 6 阶则最后剩 5 阶。 只有每次跨 7 阶,最后才正好一阶不剩。 请问这条阶梯最少共有多少阶? 输入: 无。 输出: 这条阶梯最少的阶数。 完整代

【NOI-题解】1468. 小鱼的航程1074 - 小青蛙回来了1261. 韩信点兵1254. 求车速1265. 爱因斯坦的数学题

文章目录 一、前言二、问题问题:1468. 小鱼的航程问题:1074 - 小青蛙回来了问题:1261. 韩信点兵问题:1254. 求车速问题:1265. 爱因斯坦的数学题 三、感谢 一、前言 本节主要对循环中需要流程控制的题目进行讲解,包括《1468. 小鱼的航程》《1074 - 小青蛙回来了》《1261. 韩信点兵》《1254. 求车速》《1265. 爱因斯坦的数学题》题目。

51nod 1847 奇怪的数学题

Description 给出 N,K ,请计算下面这个式子: ∑Ni=1∑Nj=1sgcd(i,j)k 其中,sgcd(i, j)表示(i, j)的所有公约数中第二大的,特殊地,如果gcd(i, j) = 1, 那么sgcd(i, j) = 0。 考虑到答案太大,请输出答案对2^32取模的结果. 1≤N≤109,1≤K≤50 样例解释: 因为gcd(i, j)=1时sgcd(i,j)

hdu1271整数对 (数学题)

Problem Description Gardon和小希玩了一个游戏,Gardon随便想了一个数A(首位不能为0),把它去掉一个数字以后得到另外一个数B,他把A和B的和N告诉了小希,让小希猜想他原来想的数字。不过为了公平起见,如果小希回答的数虽然不是A,但同样能达到那个条件(去掉其中的一个数字得到B,A和B之和是N),一样算小希胜利。而且小希如果能答出多个符合条件的数字,就可以得到额外的糖