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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

poj-1980 Unit Fraction Partition **

發(fā)布時(shí)間:2023/12/4 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj-1980 Unit Fraction Partition ** 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/*
* 本以為這題剪枝會(huì)很難,沒想到1A了。。32ms
* 這個(gè)題的難點(diǎn)是分?jǐn)?shù)的處理。。不要用double。。精度難以把握。。
*
*/

#include
<cstdio>
#include
<cmath>
using namespace std;

int p, q, a, n, tot; //如題目定義,tot為答案

//p1/q1 和 p2/q2 比較大小
int inline frac_cmp(int p1, int q1, int p2, int q2){
return p1 * q2 - p2 * q1;
}
/*
int inline gcd(int a, int b){
if(b == 0) return a;
return gcd(b, a % b);
}
*/
// p/q - 1/d 答案保存在 p/q中
void inline frac_sub(int &p, int &q, int d){
p
= p * d - q;
q
= q * d;

//可以不約分,節(jié)省時(shí)間(600ms -> 63ms)
// if(p != 0){
// int g = gcd(p, q);
// p = p / g; q = q / g;
// }
}

//last_d上一層的分母。。left_p剩下的分?jǐn)?shù)的分子。。left_q剩下的分?jǐn)?shù)的分母。。num層數(shù)。。left_a剩下的分母的最大乘積
void dfs(int last_d, int left_p, int left_q, int num, int left_a){
int next_p, next_q;
if(num == n+1 && left_p != 0) return;
if(num <= n+1 && left_p == 0){
tot
++; return;
}

// if(frac_cmp(left_p, left_q, n-num+1, last_d) > 0) return; //剩下的分?jǐn)?shù)太大(后面會(huì)判斷,可略)

for(int d=last_d; d<=left_a; d++){
if(frac_cmp(left_p, left_q, 1, d) < 0) continue; // 1/d太大

frac_sub(next_p
= left_p, next_q = left_q, d); //求得next_p, next_q
if(frac_cmp(next_p, next_q, n-num, d) > 0) break; //剩給下一層的分?jǐn)?shù)太大

dfs(d, next_p, next_q, num
+1, left_a / d);
}

}


int main(){
while(scanf("%d %d %d %d", &p, &q, &a, &n)){
if(p==0) return 0;

tot
= 0;
dfs(
1, p, q, 1, a);
printf(
"%d\n", tot);

}

return 0;

}

總結(jié)

以上是生活随笔為你收集整理的poj-1980 Unit Fraction Partition **的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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