企业网站建设背景,定制级高端网站建设,黑龙江建设网教育官网,网站建设对用户影响/* * 本以为这题剪枝会很难#xff0c;没想到1A了。。32ms * 这个题的难点是分数的处理。。不要用double。。精度难以把握。。 **/#include cstdio#include cmathusing namespace std;int p, q, a, n, tot; //如题目定义#xff0c;tot为答案//p1/q1 和 … /* * 本以为这题剪枝会很难没想到1A了。。32ms * 这个题的难点是分数的处理。。不要用double。。精度难以把握。。 **/#include cstdio#include cmathusing 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;//可以不约分节省时间600ms - 63ms// if(p ! 0){// int g gcd(p, q);// p p / g; q q / g;// }}//last_d上一层的分母。。left_p剩下的分数的分子。。left_q剩下的分数的分母。。num层数。。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 n1 left_p ! 0) return;if(num n1 left_p 0){ tot; return; }// if(frac_cmp(left_p, left_q, n-num1, last_d) 0) return; //剩下的分数太大(后面会判断可略)for(int dlast_d; dleft_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; //剩给下一层的分数太大 dfs(d, next_p, next_q, num1, left_a / d); }}int main(){while(scanf(%d %d %d %d, p, q, a, n)){if(p0) return 0; tot 0; dfs(1, p, q, 1, a); printf(%d\n, tot); }return 0;}