UVALive - 6529 找规律+dp
题目链接:
http://acm.hust.edu.cn/vjudge/problem/47664
Eleven
Time Limit: 5000MS
#### 问题描述
> In this problem, we refer to the digits of a positive integer as the sequence of digits required to write
> it in base 10 without leading zeros. For instance, the digits of N = 2090 are of course 2, 0, 9 and 0.
> Let N be a positive integer. We call a positive integer M an eleven-multiple-anagram of N if and
> only if (1) the digits of M are a permutation of the digits of N, and (2) M is a multiple of 11. You are
> required to write a program that given N, calculates the number of its eleven-multiple-anagrams.
> As an example, consider again N = 2090. The values that meet the first condition above are 2009,
> 2090, 2900, 9002, 9020 and 9200. Among those, only 2090 and 9020 satisfy the second condition, so
> the answer for N = 2090 is 2.
输入
The input file contains several test cases, each of them as described below.
A single line that contains an integer N (1 ≤ N ≤ 10100).
输出
For each test case, output a line with an integer representing the number of eleven-multiple-anagrams
of N . Because this number can be very large, you are required to output the remainder of dividing it
by 109 + 7.
样例
sample input
2090
16510
201400000000000000000000000000sample output
2
12
0
题意
给你一串数,求由这些数排列组合成的能被11整除的数的个数。
题解
能被11整除的数有一个特点,(偶数位的和-奇数位的和)%11=0;
dp[i][j][k] (0<=i-1<=9) 表示统计到i-1的时候,偶数位已经有j个数时,(y-x)%11==k(y代表偶数位和,x代表奇数位和)的情况数。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn = 111;
const int maxm = 15;
const int mod = 1e9 + 7;
char str[maxn];
int cntv[maxm];
int n;
LL C[maxn][maxn];
LL dp[maxm][maxn][maxm];
LL solve(int n) {
memset(dp, 0, sizeof(dp));
dp[0][0][0] = 1;
int sum = 0,need=n/2;
for (int i = 1; i <= 10; i++) {
for (int j = 0; j <= sum&&j <= need; j++) {
for (int dj = 0; dj <= cntv[i - 1] && (j + dj) <= need; dj++) {
int dx = (dj - (cntv[i - 1] - dj))*(i-1)%11;
dx = (dx%11 + 11) % 11;
for (int k = 0; k < 11; k++) {
int nk = (k + dx) % 11;
dp[i][j + dj][nk] = (dp[i][j + dj][nk]+dp[i - 1][j][k]*C[need-j][dj]%mod*C[n-need-(sum-j)][cntv[i-1]-dj]%mod)%mod;
}
}
}
sum += cntv[i - 1];
}
return dp[10][need][0];
}
void pre() {
memset(C, 0, sizeof(C));
C[0][0] = 1;
for (int i = 1; i < maxn; i++) {
C[i][0] = 1;
for (int j = 1; j <= i; j++) {
C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
}
}
}
void init() {
memset(cntv, 0, sizeof(cntv));
}
int main() {
pre();
while (scanf("%s", str) == 1) {
init();
n = strlen(str);
for (int i = 0; i < n; i++) {
cntv[str[i] - '0']++;
}
LL ans = solve(n);
if (cntv[0]) {
//扣掉第一位为0的情况
cntv[0]--;
ans -= solve(n - 1);
}
ans = (ans%mod + mod) % mod;
printf("%lld\n", ans);
}
return 0;
}
Notes
确定阶段的划分很重要!比如这题,用不同的数字作为阶段性,非常典型。
往往找到了阶段性,对状态转移方程的设计也会更明确。
UVALive - 6529 找规律+dp的更多相关文章
- Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)
题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...
- UVALive - 3722 找规律
题意:找规律 题解:找规律 结论是\(a^n(x-1)-\sum_{i=1}^{n-1}a^i \mod\ c\) #include<iostream> #include<algor ...
- 2015 acm taipei L-Reward the Troop(uvalive 7465)(找规律)
原题链接 就大概说的是一个将军要给部下发勋章,他的部下以和别人不一样的勋章为荣,但是他没这么多钱,所以问你最少要多少钱 要求是每个人的上司是他的上两级,他的下两级是他的部下,每个人的勋章不能和他的上司 ...
- hdu 4455 Substrings(找规律&DP)
Substrings Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- LOJ 2550 「JSOI2018」机器人——找规律+DP
题目:https://loj.ac/problem/2550 只会写20分的搜索…… #include<cstdio> #include<cstring> #include&l ...
- SPOJ GNYR09F 数字上的找规律DP
Problem C SPOJ GNYR09F dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的: dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的 ...
- UVALive 6529 Eleven 区间dp
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4540">点击打开链接 题意: ...
- 找规律 UVALive 6506 Padovan Sequence
题目传送门 /* 找规律:看看前10项就能看出规律,打个表就行了.被lld坑了一次:( */ #include <cstdio> #include <algorithm> #i ...
- 找规律/数位DP HDOJ 4722 Good Numbers
题目传送门 /* 找规律/数位DP:我做的时候差一点做出来了,只是不知道最后的 is_one () http://www.cnblogs.com/crazyapple/p/3315436.html 数 ...
随机推荐
- 实例化新的一个(new)
今天越到了一个特别尴尬的问题,其实特别简单就一句代码的事. PlayList pModel = new PlayList(); foreach (XmlNode xn1 in xnl) { ····· ...
- 命名空间中的“MvcBuildViews”。 无效
VS2013转VS2010时出现如下错误: 错误提示: 警告 1 元素 命名空间“http://schemas.microsoft.com/developer/msbuild/2003”中的“Prop ...
- VS2010 自动关闭的问题解决方法
分为如下几个解决方法: 没有安装VS2010的SP1,安装后,问题解决了 自定义设置,出现了不正确的情况,执行 devenv.exe /resetsettings 可以排除故障 使用 devenv.e ...
- 文本处理命令--cut、sort、join
声明:下面介绍的只是命令的常用选项,如果需要详细了解命令全部细节,需要参考其他的资料. 一.cut cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进 ...
- 使用MySQL数据库
登录到MySQL 当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名: mysql -h 主机名 -u 用户名 ...
- php 安装xdebug扩展
php 扩展获取地址 http://pecl.php.net/package/ 编译安装的过程 wget http://pecl.php.net/get/xdebug-2.2.2.tgz tar -z ...
- 18)Java八股文名词
>VO: value-object >DTO: Data Transform Object >DTD: Document Type Definition 文档类型定 ...
- 傅里叶变换 fft_generic halcon
傅立叶变换(FT, Fourier Transform)的作用是将一个信号由时域变换到频域.其实就是把数据由横坐标时间.纵坐标采样值的波形图格式,转换为横坐标频率.纵坐标振幅(或相位)的频谱格式.变换 ...
- Python之Flask Web开发
下载python包管理工具Pip: 访问网址:https://pip.pypa.io/en/stable/installing/ 下载文件get-pip.py到本地计算机 定位到get-pip. ...
- Oracle表变化趋势追踪记录
#DBA_HIST_SEG_STAT可以看出对象的使用趋势,构造如下SQL查询出每个时间段内数据库对象的增长量,其中DB_BLOCK_CHANGES_DELTA为块个数 select c.SNAP_I ...