题目详情 我们知道整数是可以用整数加分数的形式表示的,例如5=3+9562/4781=3+9712/4856=3+2956/1478=3+ 9172/4586=2+9762/3254等等其中1~9只在前4种的整数部分和分子分母出现且只出现一次,我们求这样的 式子的个数即test(x),其中65535>x>0,例如test(5)=4。 输入描述: 输入的第一行是一个整数N<10000,表示数据组数,接下来N行,每行包含一个正整数x。 输出描述: 对于每个x,输出test(x)。 答题说明 输入样例: 3 5 123 321 样例输出: 4 3 7 思路:1到9这9个数的全排列有大约30多万个。然后对每个全排列单独处理,将9个数分成3部分(整数部分+分子 部分+分母部分),然后枚举,有一个优化就是分子部分的位数大于等于分母部分的位数。 代码: #include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int MAXN = 65535; int cnt[MAXN+1]; void init(); int main() { init(); int t; scanf("%d", &t); int n; while(t--) { scanf("%d", &n); printf("%d\n", cnt[n]); } return 0; } void init() { fill_n(cnt, MAXN+1, 0); char ch[10] = "123456789"; do{ int num=0, a, b; for(int i=0; ; i++) { num = num*10 + ch[i] - '0'; if(num >MAXN) break; int j, t = (9-i)/2 + i; a = b = 0; for(j=i+1; j<=t; j++) { a = a*10 + ch[j] - '0'; } int m=1; for(j=t+1; j<9; j++) { b = b*10 + ch[j] - '0'; m = m*10; } m /= 10; while(b != 0) { if(a%b == 0) { if(num + a/b <= MAXN) { cnt[num + a/b]++; } } a = a*10 + b/m; b %= m; m /= 10; } } }while(next_permutation(ch, ch+9)); }