CF401D Roman and Numbers 状压DP
CF401D
题意翻译
将n(n<=10^18)的各位数字重新排列(不允许有前导零) 求 可以构造几个mod m等于0的数字
题目描述
Roman is a young mathematician, very famous in Uzhland. Unfortunately, Sereja doesn't think so. To make Sereja change his mind, Roman is ready to solve any mathematical problem. After some thought, Sereja asked Roma to find, how many numbers are close to number n n n , modulo m m m .
Number x x x is considered close to number n n n modulo m m m , if:
- it can be obtained by rearranging the digits of number n n n ,
- it doesn't have any leading zeroes,
- the remainder after dividing number x x x by m m m equals 0.
Roman is a good mathematician, but the number of such numbers is too huge for him. So he asks you to help him.
输入输出格式
输入格式:
The first line contains two integers: n n n $ (1<=n<10^{18}) $ and m m m (1<=m<=100) (1<=m<=100) (1<=m<=100) .
输出格式:
In a single line print a single integer — the number of numbers close to number n n n modulo m m m .
输入输出样例
- 104 2
- 3
- 223 4
- 1
- 7067678 8
- 47
说明
In the first sample the required numbers are: 104, 140, 410.
In the second sample the required number is 232.
分析:
题目描述确实比较吓人, n位数字重新排列最多可以创造出多少个%m == 0 的数;
转移方程 : f[i|(1 << k)][(j * 10 + x) % m] += f[i][j];
意义:对于第k位数x, 都可以由不选他转移到选他, 就是 i -> i |(1 << k);
然后第二维就由 j -> (j *10 + x) % m (显然);
注意 : 因为状态压缩是暴力的把每一位数当成与前边的数都不一样, 比如 11 ,应该算一次, 但是我们却算了两次;
方案 : 1. 最后除以cnt!(cnt为一个数出现了多少次)。
2. 直接去重。
代码奉上:
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- #define maxn (1 << 18) + 5
- #define int long long
- int n, m;
- int s[21];
- int f[maxn][105];
- char ch[20];
- bool vis[20];
- signed main()
- {
- scanf("%s%lld", &ch, &m);
- int n = strlen(ch);
- f[0][0] = 1;
- int e = (1 << n);
- for(register int i = 0 ; i < e ; i ++)
- {
- for(register int j = 0 ; j < m ; j ++)
- {
- memset(vis, 0, sizeof vis);
- for(register int k = 0 ; k < n ; k ++)
- {
- int x = ch[k] - '0';
- if(i & (1 << k)) continue;
- if(i == 0 && x == 0) continue;
- if(vis[x]) continue;
- vis[x] = 1;
- f[i|(1<<k)][(j*10+x)%m] += f[i][j];
- }
- }
- }
- cout << f[e-1][0];
- return 0;
- }
CF401D Roman and Numbers 状压DP的更多相关文章
- Codeforces Round #235 (Div. 2) D. Roman and Numbers 状压dp+数位dp
题目链接: http://codeforces.com/problemset/problem/401/D D. Roman and Numbers time limit per test4 secon ...
- CF449D Jzzhu and Numbers (状压DP+容斥)
题目大意: 给出一个长度为n的序列,构造出一个序列使得它们的位与和为0,求方案数 也就是从序列里面选出一个非空子集使这些数按位与起来为0. 看了好久才明白题解在干嘛,我们先要表示出两两组合位与和为0的 ...
- Codeforces Round #235 (Div. 2) D. Roman and Numbers(如压力dp)
Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes input standard i ...
- [poj2411] Mondriaan's Dream (状压DP)
状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp
题目链接: 题目 D. Kefa and Dishes time limit per test:2 seconds memory limit per test:256 megabytes 问题描述 W ...
- Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP
Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...
- TZOJ 2289 Help Bob(状压DP)
描述 Bob loves Pizza but is always out of money. One day he reads in the newspapers that his favorite ...
- Educational Codeforces Round 13 E. Another Sith Tournament 状压dp
E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...
- Codeforces Beta Round #8 C. Looking for Order 状压dp
题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...
随机推荐
- Yum未完成事务问题
1.安装 yum-complete-transaction [root@linux-node1 ~]# yum -y install yum-utils 2.清除yum缓存 [root@linux-n ...
- 01 (OC)* @property 后面可以有哪些修饰符?
一:@property 后面可以有哪些修饰符? 1:线程安全的: atomic,nonatomic 2:访问权限的 readonly,readwrite 3:内存管理(ARC) assign, cop ...
- 记录工作中groovy动态生成Flink任务
工作中的痛点:有一个计算的任务,需要配置成前端配置好一些简单的信息,例如名字,计算间隔,计算规则(这个是需要提前写好,开放给用户选择的),然后通过提交到我们的计算引擎中心生成对应的任务jar包提交到服 ...
- 小白专场-FileTransfer-c语言实现
目录 一.集合的简化表示 二.题意理解 三.程序框架搭建 3.1 Input_connection 3.2 Check_connection 3.3 Check_network 四.pta测试 五.按 ...
- 200行代码实现Mini ASP.NET Core
前言 在学习ASP.NET Core源码过程中,偶然看见蒋金楠老师的ASP.NET Core框架揭秘,不到200行代码实现了ASP.NET Core Mini框架,针对框架本质进行了讲解,受益匪浅,本 ...
- 基于Docker搭建大数据集群(一)Docker环境部署
本篇文章是基于Docker搭建大数据集群系列的开篇之作 主要内容 docker搭建 docker部署CentOS 容器免密钥通信 容器保存成镜像 docker镜像发布 环境 Linux 7.6 一.D ...
- bootstrap准备工作(1)
1.下载bootstrap包 http://v3.bootcss.com/getting-started/#download 2.下载结构 如果要用js里面的js效果,需要先插入juqery.js & ...
- Vue:获取当前定位城市名
实现思想:通过定位获取到当前所在城市名: 1.在工程目录index.html中引入: <script type="text/javascript" src="htt ...
- Activity初学乍练
1.Activity的概念与Activity的生命周期图: 注意事项: onPause()和onStop()被调用的前提是: 打开了一个新的Activity!而前者是旧Activity还可见的状态:后 ...
- mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)
hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴. 下期我们将继续分享go语言的系列讲解, ...