zzuli-2266 number

题目描述

某人刚学习了数位DP,他在某天忽然思考如下问题:

给定n,问有多少数对<x, y>满足:

x, y∈[1, n], x < y

           x, y中出现的[0, 9]的数码种类相同

输入

一个整数n (n <= 107)

输出

输出一个数即答案

样例输入

30

样例输出

3

提示

<1, 11> <2, 22> <12, 21>

来源

郑州轻工业学院第十届ACM程序设计大赛 

 

这题是思路是x,y在1~n内,而且x和y中出现的数码相同,因此,我们可以暴力存从1到n的所有数码状态的个数。 然后求个组合就行了。

比如:12 121 121212 1212121 212121 这几个数的数码都是12,那么数码为12的个数为5,这五个数任取两个都可以组成一种x,y。

具体看代码:

 1 #include<iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <string>
 7 typedef long long ll;
 8 using namespace std;
 9 const int maxn = 1e6;
10 const int inf = 0x3f3f3f3f;
11 int nu[maxn];
12 int dis[maxn];
13 int vis[11];
14 using namespace std;
15 int main()
16 {
17     int n;
18     scanf("%d", &n);
19     for(int i = 1; i <= n; ++i) {
20         memset(vis, 0 , sizeof(vis));
21         int x = i;
22         while(x) {
23             vis[x % 10] = 1;
24             x /= 10;
25         }
26         int num = 0;
27         for(int j = 0; j <= 9; ++j) {
28             if(vis[j]) {
29                 num += 1 << j;
30             }
31         }
32         nu[num]++;
33     }
34     ll ans = 0;
35     for(int i = 0; i < (1 << 10); ++i) {
36         if(nu[i])
37         ans += nu[i] * (nu[i] - 1) / 2;
38     }
39     printf("%lld\n", ans);
40     return 0;
41 }
View Code

 

转载于:https://www.cnblogs.com/zmin/p/8976198.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值