【IDDFS】——UVA12558——诶及分数
题意:求n,m的诶及分数,有k个数不能用。
思路:把k个数当做搜索失败就行
代码如下:
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; typedef long long LL; int maxd; LL n,m,k; LL ans[10010]; LL tmp[10010]; LL ban[10]; int flag; LL gcd(LL a,LL b) { return b==0?a:gcd(b,a%b); } bool isb(LL a) { for(int i=0;i<k;i++) { if(a==ban[i]) return true; } return false; } bool better() { for(int i=maxd;i>=0;--i) { if(tmp[i]!=ans[i]) return tmp[i]<ans[i]; } return 0; } void dfs(int d,LL a,LL b) { if(d==maxd) { if(b%a)return ; tmp[d]=b/a; if(isb(b/a))return ; if(better()||flag==0) memcpy(ans,tmp,sizeof(LL)*(d+1)); flag=1; return ; } for(int i =max(b/a,tmp[d-1])+1; ; i++) { if(b * (maxd+1-d) <= i * a) break; if(isb(i))continue; tmp[d] = i; LL b2 = b*i; LL a2 = a*i - b; LL g = gcd(a2, b2); dfs(d+1 , a2/g , b2/g); } } int main() { int t; cin>>t; for(int z=1;z<=t;z++) { cin>>n>>m>>k; for(int i=0;i<k;i++) cin>>ban[i]; for(maxd=0;;maxd++) { flag=0; dfs(0,n,m); if(flag==1) break; } cout << "Case " <<z<< ": "; if(flag==1) { cout << n << "/" << m << "="; for(int i = 0; i < maxd; i++) cout << "1/" << ans[i] << "+"; cout << "1/" << ans[maxd] << "\n"; } else cout << "No solution.\n"; } return 0; }

浙公网安备 33010602011771号