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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[数论] 小球碰撞

發布時間:2024/8/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [数论] 小球碰撞 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 輸入
  • 輸出
  • 樣例輸入
  • 樣例輸出
  • 解題思路
  • 參考代碼


題目描述



輸入

輸出

樣例輸入

2 3 1

樣例輸出

2.5


解題思路

為了方便,我們把mamama記作aaa,把mbmbmb記作bbb,把PPP記作ccc,那么題目就變成了:
已知a,b,ca,b,ca,b,c,求ax+by=cax+by=cax+by=c的一組解,使得0.5?a?x2+0.5?b?y20.5*a*x^2+0.5*b*y^20.5?a?x2+0.5?b?y2最小,輸出這個最小值
顯然,第一步我們用拓展歐幾里得算法求出這個不定方程的一組特解,為{x0y0\begin{cases}x_0 \\ y_0 \\ \end{cases}{x0?y0??,令aaabbb的最大公因數為ddd,那么通解為{x1=x0+bdty1=y0?adt\begin{cases}x_1=x_0+\fracozvdkddzhkzdt \\ y_1=y_0-\frac{a}ozvdkddzhkzdt\\ \end{cases}{x1?=x0?+db?ty1?=y0??da?t?
所以ans=0.5(ax12+by12)ans=0.5(ax_1^2+by_1^2)ans=0.5(ax12?+by12?)x1=x0+bdtx_1=x_0+\fracozvdkddzhkzdtx1?=x0?+db?ty1=y0?adty_1=y_0-\frac{a}ozvdkddzhkzdty1?=y0??da?t代入這個式子化簡后可得:ans=0.5(a+bd2abt2+2ab(x0?y0)dt+ax02+by02)ans=0.5(\frac{a+b}{d^2}abt^2+2\frac{ab(x_0-y_0)}ozvdkddzhkzdt+ax_0^2+by_0^2)ans=0.5(d2a+b?abt2+2dab(x0??y0?)?t+ax02?+by02?)
這就是一個關于ttt的二次函數,對稱軸為:t1=?ab(x0?y0)da+bd2ab=(y0?x0)da+bt_1=-\frac{\frac{ab(x_0-y_0)}ozvdkddzhkzd}{\frac{a+b}{d^2}ab}=\frac{(y_0-x_0)d}{a+b}t1?=?d2a+b?abdab(x0??y0?)??=a+b(y0??x0?)d?
再在t1t_1t1?兩邊的兩個整點(也就是?t1?\lfloor t1 \rfloor?t1??t1?+1\lfloor t1 \rfloor+1?t1?+1)中去找答案即可


參考代碼

#include <cstdio> #include <cstring> #include <cmath> #define reg registertemplate <class T> inline T read() {T x = 0; T f = 1; char s = getchar();while(s < '0' || s > '9') {if(s == '-') f = -1; s = getchar();}while(s >= '0' && s <= '9') {x = (x << 3) + (x << 1) + s - 48; s = getchar();}return x * f; }template <typename T> inline void wri(T x) {if(x < 0) {x = -x; putchar('-');}if(x / 10) wri(x / 10);putchar(x % 10 + 48); }template <typename T> inline void write(T x, char s) {wri(x);putchar(s); }template <typename T> inline T Min(T x, T y) {return x < y ? x : y;}#define LL long longint ma, mb, p, gcd; double va, vb, t, tmp, pa, pb, ans;inline int exgcd(int a, int b, double &x, double &y) { //拓展歐幾里得算法if(! b) {x = 1, y = 0;return a;}else {int tmp = exgcd(b, a % b, y, x);y -= x * (a / b);return tmp;} }int main() {ma = read<int>(), mb = read<int>(), p = read<int>();gcd = exgcd(ma, mb, va, vb);va *= (p * 1.0 / gcd), vb *= (p * 1.0 / gcd); //算出特解if(p % gcd != 0) { //判斷無解puts("-1");return 0;}t = (vb - va) * gcd * 1.0 / (ma + mb); //算出t1并在兩邊找答案tmp = floor(t);pa = va + tmp * (mb / gcd);pb = vb - tmp * (ma / gcd);ans = 0.5 * ma * pa * pa + 0.5 * mb * pb * pb;tmp = floor(t) + 1;pa = va + tmp * (mb / gcd);pb = vb - tmp * (ma / gcd);ans = Min(ans, 0.5 * ma * pa * pa + 0.5 * mb * pb * pb);LL q = ans; //判斷是否為浮點數if(ans != q)printf("%.1lf\n", ans);elsewrite(q, '\n');return 0; }

總結

以上是生活随笔為你收集整理的[数论] 小球碰撞的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。