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