题目链接:

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

201400000000000000000000000000

sample 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的更多相关文章

  1. Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)

    题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...

  2. UVALive - 3722 找规律

    题意:找规律 题解:找规律 结论是\(a^n(x-1)-\sum_{i=1}^{n-1}a^i \mod\ c\) #include<iostream> #include<algor ...

  3. 2015 acm taipei L-Reward the Troop(uvalive 7465)(找规律)

    原题链接 就大概说的是一个将军要给部下发勋章,他的部下以和别人不一样的勋章为荣,但是他没这么多钱,所以问你最少要多少钱 要求是每个人的上司是他的上两级,他的下两级是他的部下,每个人的勋章不能和他的上司 ...

  4. hdu 4455 Substrings(找规律&DP)

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. LOJ 2550 「JSOI2018」机器人——找规律+DP

    题目:https://loj.ac/problem/2550 只会写20分的搜索…… #include<cstdio> #include<cstring> #include&l ...

  6. SPOJ GNYR09F 数字上的找规律DP

    Problem C      SPOJ GNYR09F dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的: dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的 ...

  7. UVALive 6529 Eleven 区间dp

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4540">点击打开链接 题意: ...

  8. 找规律 UVALive 6506 Padovan Sequence

    题目传送门 /* 找规律:看看前10项就能看出规律,打个表就行了.被lld坑了一次:( */ #include <cstdio> #include <algorithm> #i ...

  9. 找规律/数位DP HDOJ 4722 Good Numbers

    题目传送门 /* 找规律/数位DP:我做的时候差一点做出来了,只是不知道最后的 is_one () http://www.cnblogs.com/crazyapple/p/3315436.html 数 ...

随机推荐

  1. sqlserver 保留小数方法

    1. 使用 Round() 函数,如 Round(@num,2)  参数 2 表示 保留两位有效数字. 2. 更好的方法是使用 Convert(decimal(18,2),@num) 实现转换,dec ...

  2. C# @Page指令中的AutoEventWireup,CodeBehind,Inherits

    AutoEventWireup 如果 Page 指令的 AutoEventWireup 属性被设置为 true(或者如果缺少此属性,因为它默认为 true) ,该页框架将自动调用页事件,即 Page_ ...

  3. C# 执行JS

    需引用命名空间:Microsoft.VsaMicrosoft.JScript using System; using System.Collections.Generic; using System. ...

  4. js生成有缩进的表格

    项目中用到用了两天时间想到的,记录下来,如有更好的方法,留言给我,谢谢! js做如下表格: json [{"id":302,"serviceId":15,&qu ...

  5. SequoiaDB的数据分区操作

    在SequoiaDB集群环境中,用户往往将数据存放在不同的逻辑节点与物理节点中,以达到并行计算的目的. 分区:把包含相同数据的一组数据节点叫一个分区,如上图绿色方块组成三个分区. 分区键:切分时,所依 ...

  6. PHP 表单 - 验证邮件和URL

    PHP - 验证名称 以下代码将通过简单的方式来检测 name 字段是否包含字母和空格,如果 name 字段值不合法,将输出错误信息: $name = test_input($_POST[" ...

  7. memcache 简单入门应用

    1.memcache 简介和安装: 下载:下载文件,解压到某个地方. 2.数据存储格式 键值对,一个key对应一个值,一个值在内存中占用一个或多个4k大小的块. 3.php使用memcache的方式 ...

  8. SQL Server 基础:Cast和Convert的区别

    CAST 和 CONVERT 都可以将某种数据类型的表达式显式转换为另一种数据类型. 语法: CAST ( expression AS data_type ) CONVERT (data_type[( ...

  9. ubuntu 14.04 下安装jdk8及 smartgithg

    公司使用git作为源码管理,又需要在ubuntu下工作,然后,自己就找了找,目前ubuntu下的git gui客户端,感觉 smartgit算是其中比较好用的一个,下边是具体安装步骤 说明,smart ...

  10. WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)

    无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...