日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

牛客练习赛60 ~ 斩杀线计算大师

發(fā)布時(shí)間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客练习赛60 ~ 斩杀线计算大师 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目傳送

時(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
輸入

3 4 5 20

輸出

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原理和博客

    #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod =1e9+3; ll exgcd(ll a,ll b,ll &x,ll &y) {if(!b){x=1;y=0;return a;}ll d;d=exgcd(b,a%b,y,x);y=y-a/b*x;return d; }//exgcd模板 int main() {ll a,b,c,k,x,y;scanf("%lld%lld%lld%lld",&a,&b,&c,&k);for(ll i=0;i<k/c;i++){ll ans=(k-i*c);//去掉c*i的剩余部分ll w = exgcd(a,b,x,y);if(ans%w)continue;x= x * ans / w;y= y * ans / w;x=( x % ( b / w ) + ( b / w ) ) % ( b / w );y= ( ans - x * a ) / b;if(x>=0&&y>=0){cout<<x<<" "<<y<<" "<<i;return 0;}} }
  • 方法二
  • 公式還有個(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了

    for(i){for(j){if( k - a i - b j ) % c = = 0{cout<<;}}}

    曾經(jīng)noip好像考過(guò)ecgcd裸題感興趣可以做做

    總結(jié)

    以上是生活随笔為你收集整理的牛客练习赛60 ~ 斩杀线计算大师的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。