题目:一个数能够用一种素数元素的个数表示的形式,43560=23×32×51×112表示成41223;

第一个数是素因子的种类,第二个是每一个素因子的个数递增排列。给你一个这样的形式的串,

问原来的数可能有几种情况。

分析:数论,计数原理,组合数学。

对于每一个串,第一个数字一定是素因子的种类数。

首先,利用搜索找到全部剩余串的可能组合形式。

然后。求出每种情况下的组合数。加和就可以。

说明:注意一个新的数字不能以0開始。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio> using namespace std; int p[11],f[11];
char buf[22]; long long value(int s, int t)
{
long long V = 0LL;
for (int i = s ; i <= t ; ++ i) {
V *= 10LL;
V += buf[i]-'0';
}
return V;
} long long save[11];
long long temp[11];
long long dfs(int s, int l, int d, int n)
{
long long sum = 0LL;
if (d == n && s == l) {
sum = 0LL+p[n];
//去掉同样元素的内部排列
int count = 1;
for (int i = 1 ; i < d ; ++ i) {
if (save[i] == save[i-1])
count ++;
else {
sum /= f[count];
count = 1;
}
}
sum /= f[count];
}
for (int i = s ; i < l ; ++ i) {
save[d] = value(s, i);
if ((!d || save[d] >= save[d-1]) && buf[i+1] != '0') {
temp[d] = save[d];
sum += dfs(i+1, l, d+1, n);
save[d] = temp[d];
}
}
return sum;
} int main()
{
p[0] = 1; f[0] = 1;
for (int i = 1 ; i < 10 ; ++ i) {
p[i] = p[i-1]*(10-i);
f[i] = f[i-1]*i;
} int n,l,d;
while (~scanf("%d",&n))
for (int i = 1 ; i <= n ; ++ i) {
scanf("%s",buf);
l = strlen(buf);
cout << dfs(1, l, 0, buf[0]-'0') << endl;
}
return 0;
}

UVa 12377 - Number Coding的更多相关文章

  1. UVA 12377 Number Coding --DFS

    题意:给一串数字,第一个数是Num的话,要使后面的数字组成Num个数,而且为不降的,将这Num个数分配到9个素因子上作为指数,问能组成多少个不同的数 解法:dfs一遍,看后面的数字能组成Num个不降数 ...

  2. UVA 1558 - Number Game(博弈dp)

    UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp ...

  3. uva 11885 - Number of Battlefields(矩阵高速幂)

    题目连接:uva 11885 - Number of Battlefields 题目大意:给出周长p,问多少种形状的周长为p的,而且该图形的最小包围矩阵的周长也是p,不包含矩形. 解题思路:矩阵高速幂 ...

  4. UVA 10706 Number Sequence (找规律 + 打表 + 查找)

    Problem B Number Sequence Input: standard input Output: standard output Time Limit: 1 second A singl ...

  5. uva 10706 Number Sequence(数学规律)

    题目连接:10706 - Number Sequence 题目大意:有一个有0 ~ 9组成的序列,1   1 2    1 2 3   1 2 3 4   1 2 3 4 5 ....就是第一位为1. ...

  6. UVA 11885 - Number of Battlefields(斐波那契)

    11885 - Number of Battlefields 题意:给周长.求能围成的战场数目.不包含矩形. 思路:详细的递推没递推出来,可是看了网上一个规律,假设包含矩形的答案应该是斐波那契数列(可 ...

  7. UVA 10006_Carmichael number

    题意: N 为合数,对于任意一个在(1,N)之间的数满足 anmodn=a,则称N为Carmichael number,对于给定的N,判断是否为Carmichael number. 分析: 素数区间筛 ...

  8. UVa 263 - Number Chains

    题目:给你一个数字n0.将它的每一个位的数字按递增排序生成数a,按递减排序生成数b, 新的数字为n1 = a-b,下次依照相同方法计算n1,知道出现循环,问计算了多少次. 分析:数论.模拟.直接模拟计 ...

  9. UVa 11371 - Number Theory for Newbies

    題目:給你一個數字n.將裡面每位的數又一次組合形成a,b.使得a-b最大且是9的倍數. 分析:數論. 題目要求a,b和n的位數同样,不能有前導0. 定理1:交換一個數字中的某兩個位的數,形成的新數組和 ...

随机推荐

  1. java中的equals与==的区别

    equals是Object类的公共方法,方法内部是用==实现的.但是很多类都重写了equals方法,例如基本数据类型的封装类和String类,重写后比较的是对象的值或者内容是否相同.而==是比较地址, ...

  2. Java的9种基本数据类型以及封装类

    Java的9种基本数据类型以及封装类 基本类型 大小(单位/字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer ...

  3. PAT Basic 1061

    1061 判断题 判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量 ...

  4. BZOJ 2725: [Violet 6]故乡的梦

    求出最短路径树,对于一个询问(x,y) 若不在树上S->T的链上,则答案不变,若在链上,考虑用一条非树边替换这条边,这条非树边必须跨越x->y这条边,线段树维护区间最小值 #include ...

  5. 转:sudo 的常见用法和参数选项

    原文链接:http://wiki.ubuntu.org.cn/Sudo sudo,以其他用户身份执行一个命令. 用法 sudo -h | -K | -V sudo -v [-Akns] [-g gro ...

  6. angularjs bootstrap 简介

    1.angular特色 数据双向绑定 模块化  var myapp=angular.module... 控制器  myapp.controller(){} 2.bootstrap特色 栅格结构  cs ...

  7. 升级完Android Studio3.2后,打包release出现的错误

    升级完Android Studio2.3后,打包release出现的错误 Error:Execution failed for task ':qq:lintVitalRelease'.> Lin ...

  8. 巴厘岛的雕塑 BZOJ 4069

    巴厘岛的雕塑 题解: 题意是要求分组使每组的和按位取或的值最小 那么考虑贪心,尽量使高位为0 于是枚举位置,从最高位枚举 假设当前枚举到第l位. 令 f[i][j] 表示前 i 个数分成 j 组,满足 ...

  9. 标准C程序设计七---21

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  10. Python入门--13--爬虫一

    URL的格式一般为(带方括号的是可选的): protocol://hostname[:port]/path/[;parameters][?query]#fragment URL由三部分组成: 第一部分 ...