XTU 1270 Unique Digit Number(打表,推公式)

数位不同的数
http://202.197.224.59/exam/index.php/problem/read/id/1270
题目描述

数位不同的数是指所有数位上的数码都不一样的数,比如“123”三个数码1,2,3,都不一样,所以是数位不同的数;但是“1232”中有两个相同的数码2,所以不是。请写一个程序,计算第几个符合条件的数是什么?

输入

每行输入一个整数n(1≤n≤8877691)。

输出

每行输出一个整数,为对应样例的结果。

样例输入

1
10
100
8877691
样例输出

0
9
120
9876543210

思路:
第一种当然是推公式啊,可是我不会啊(暗中膜400B过的大佬orz)

第二种当然是数位dp+二分查找啊,可是我不会啊。

其实打表是世界上最好的算法。
不难看出不同数字的排列组合应该和数的位数n挂钩,
一位数有10种,
二位数有9 * 9种,
三位数有9 * 9 * 8种,
……
九位数有9 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2种
十位数有9 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1种
于是我们可以开10个数组用来存不同位数的答案,用暴力回溯实现。

#include<bits/stdc++.h>
using namespace std;
#define ll __int64
ll ans1[10+1];
ll ans2[9*9+1];
ll ans3[9*9*8+1];
ll ans4[9*9*8*7+1];
ll ans5[9*9*8*7*6+1];
ll ans6[9*9*8*7*6*5+1];
ll ans7[9*9*8*7*6*5*4+
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值