江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)
生活随笔
收集整理的這篇文章主要介紹了
江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:https://ac.nowcoder.com/acm/contest/635/H
來源:牛客網
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
艾蘭島和沃夫島的時間算法很不一樣,它們都擁有它們自己的魔法大時鐘。以我們的時間來看艾蘭島的大時鐘起鳴在b, b+a, b+2a, b+3a,… ,(a,b均為正整數)并且沃夫島的大時鐘起鳴在d, d+c, d+2c, d+3c,….(c,d均為正整數)因為計時的方法不同,兩邊經常打仗,但可能有某些時間點兩邊的大時鐘同時起鳴。我們稱這樣的時間點為和平點。求第一個和平點。(如果沒有這樣的時間點,輸出-1)
輸入描述:
第一行輸入兩個整數a,b ( 1< a,b < 5*108)
第二行輸入兩個整數c,d ( 1< c,d < 5*108)
輸出描述:
第一個和平點所表示的時間(如果沒有這樣的時間點,輸出-1) 示例1輸入
復制 20 2 9 19輸出
復制 82 示例2輸入
復制 2 1 16 12輸出
復制 -1解題思路:由題目我們可以很容易列出方程b+ax=d+cy,令b<d,如果b>d我們就交換(a,c),(b,d),這樣的話我們就只需要求出y的最小正整數解,然后d+cy必定是答案,我們把式子轉化為ax-cy=d-b,然后再轉化為ax+cy=d-b,改成求y的最大非正整數解,答案也隨即變成d-cy了。
代碼: #include<iostream> using namespace std; typedef long long ll; ll a,b,c,d; void exgcd(ll a,ll b,ll &x,ll &y,ll &c){if(!b){x=1,y=0,c=a;}else{exgcd(b,a%b,y,x,c);y-=a/b*x;} } int main(){cin>>a>>b>>c>>d;if(b>d){swap(b,d);swap(a,c);}ll x,y,gcd;exgcd(a,c,x,y,gcd);if((d-b)%gcd){puts("-1");return 0;}x*=(d-b)/gcd; y*=(d-b)/gcd;y%=(a/gcd);while(y>0) y-=a/gcd;cout<<d-c*y<<endl;return 0; }
?
轉載于:https://www.cnblogs.com/zjl192628928/p/10776689.html
總結
以上是生活随笔為你收集整理的江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell命令-磁盘与文件系统之dump
- 下一篇: js构造函数内存在的闭包