牛客练习赛60 ~ 斩杀线计算大师
題目傳送
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K Special Judge,
64bit IO Format: %lld
題目描述
算術能力是每個爐石玩家必不可少的,假設現在有三種傷害卡,傷害值分別是a,b,c。并且每種傷害卡的數量你可以認為是無限的。現在牛牛想知道是否存在一種方式可以剛好造成k點傷害,輸出x,y,z分別表示三種傷害卡的使用個數。
數據保證一定存在解。如果存在多組解,輸出任意一組。
輸入描述:
一行四個整數分別表示a,b,c,k
輸出描述:
一行輸出三個整數分別表示x,y,z
示例1
輸入
輸出
4 2 0備注:
1 ≤ a , b , c ≤ 1e5
0 ≤ k ≤ 1e12
- 題意:
就是多少個a+多少個b+多少個c=k
問你這個“多少個”分別是什么
題解
把題目改成公式形式就是
ax+by+cz=k
沒錯,其實就是exgcd,只不過exgcd是ax+by=k
你把咱們這個式子再變變形
就能得到:
a x + b y = k - c * z
而這個z我們可以枚舉
那就是a x + b y = k - c * i
題目說了肯定有解,那放心枚舉i就完事了
把后面這部分-ci當做整體M
ax+by=M
然后就是exgcd的步驟
用exgcd求出x0,y0
ax0+by0=GCD(a,b)
兩邊同時除以gcd(a,b)
(gcd(a,b)我們用w代替)
兩邊除以w,再乘c
ax0+by0-gcd(a,b)+by*c/gcd(a,b)=c
如果w=1
x = x0 + b * t
y = y0 - a * t
且對任一正數t,皆成立
根據這個我們就可以求出方程所有解
t = b / w
x= ( x % t + t ) % t
有空專門整理一下exgcd原理和博客
公式還有個變形方式:
k-ax-by=cz
(k-ax-by)/c=z
也就是( k - a x - b y ) % c = = 0
( k - a i - b j ) % c = = 0
枚舉i和j就ok了
曾經noip好像考過ecgcd裸題感興趣可以做做
總結
以上是生活随笔為你收集整理的牛客练习赛60 ~ 斩杀线计算大师的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 84消毒液中84指什么 84消毒液中84
- 下一篇: 牛客网【每日一题】Shortest Pa