本文主要是介绍【SSL_2020.10.27】小biu闯关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
小biu~闯关
蛶磃糹樐(解题思路)
首先,我们要知道一个东西:
[ A , B ] ⟹ [ 2 A , 2 B ] ⟹ [ K A , K B ] [A,B] \implies [2A,2B] \implies [KA,KB] [A,B]⟹[2A,2B]⟹[KA,KB]
那么这是为什么呢?以样例为例:
[ 8 , 10 ] = 8 , 9 , 10 [8,10]=8,9,10 [8,10]=8,9,10
8 + 8 = 16 , 8 + 9 = 17 , 9 + 9 = 10 , 9 + 10 = 20 8+8=16,8+9=17,9+9=10,9+10=20 8+8=16,8+9=17,9+9=10,9+10=20
= [ 16 , 20 ] = [ 2 ∗ 8 , 2 ∗ 10 ] =[16,20]=[2*8,2*10] =[16,20]=[2∗8,2∗10]
然后呢,我们又要知道另一个东西: ∵ a < b \because a<b ∵a<b ∴ b − a > 0 \therefore b-a>0 ∴b−a>0 ∴ k b − k a 单 调 递 增 \therefore kb-ka单调递增 ∴kb−ka单调递增 ∴ ( k + 1 ) a − k b 单 调 递 减 \therefore (k+1)a-kb 单调递减 ∴(k+1)a−kb单调递减
那么区间总有一天会重合,我们可以找出这个K,然后暴力求和就可以了。
code
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;int T;
ll a,b,x,y;
ll ans;int main()
{cin>>T;while(T--){scanf("%lld%lld%lld%lld",&a,&b,&x,&y);ll ans=0,k=1;if(b<x)k=x/b+1;while(1){if(k*a>y)break;if((k+1)*a<=k*b+1){ans+=y-max(x,k*a)+1;break;}elseans+=min(y,k*b)-max(x,k*a)+1;k++;}cout<<ans<<endl;}
}
这篇关于【SSL_2020.10.27】小biu闯关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!