牛客國慶集訓派對Day1-C:Utawarerumono(數學)
阿新 • • 發佈:2018-12-19
給出一個關於變數x,y的不定方程,顯然這個方程可能有多個整數解。
如果有解,使得最小的一組整數解是什麼。你只需要輸出的最小值。
輸入描述:
第一行三個空格隔開的整數a,b,c(0 ≤ a,b,c≤ 105)。
第二行兩個空格隔開的整數p1,p2(1 ≤ p1,p2 ≤ 105)。
第三行兩個空格隔開的整數q1,q2(1 ≤ q1,q2 ≤ 105)。
輸出描述:
如果方程無整數解,輸出“Kuon”。
如果有整數解,輸出的最小值。
示例1
輸入
2 2 1
1 1
1 1
輸出
Kuon
示例2
輸入
1 2 3
1 1
1 1
輸出
4
思路:
其實有拓展歐幾里得的影子
用GCD來判斷不定方程是否有解,如果有解,將不定方程和帶入方程進行化簡;
過程如下:
;
將y帶入方程可得:
由拋物線的性質可知:方程的最小值在對稱軸附近
由上式化簡可知,拋物線的對稱軸為:
然後在這條拋物線兩邊來找滿足的整數解就可以了(即滿足),然後求兩邊滿足要求的最小解就可以了
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> using namespace std; ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;} int main(int argc, char const *argv[]) { ll a,b,c; ll p1,p2; ll q1,q2; cin>>a>>b>>c; cin>>p1>>p2; cin>>q1>>q2; ll _=gcd(a,b); if(c%_) cout<<"Kuon"<<endl; else { ll x=((2*a*c*q2)/(b*b)+a*q1/b-p1)/(2*(p2+(a*a*q2)/(b*b))); ll x1=x,x2=x; while((c-a*x1)%b) x1--; while((c-a*x2)%b) x2++; ll a1=(c-a*x1)/b; ll a2=(c-a*x2)/b; ll res1=(p1*x1+p2*x1*x1+q2*a1*a1+q1*a1); ll res2=(p1*x2+p2*x2*x2+q2*a2*a2+q1*a2); cout<<min(res1,res2)<<endl; } return 0; }
其實是down大神的這是連結