lightoj 1158 - Anagram Division

2024-01-29 12:58
文章标签 anagram lightoj division 1158

本文主要是介绍lightoj 1158 - Anagram Division,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Given a string s and a positive integer d you have to determine how many permutations of s are divisible by d.

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case contains a string s (1 ≤ slength ≤ 10) and an integer d (1 ≤ d ≤ 1001)s will only contain decimal digits.

Output

For each case, print the case number and the number of permutations of s that are divisible by d.

Sample Input

Output for Sample Input

3

000 1

1234567890 1

123434 2

Case 1: 1

Case 2: 3628800

Case 3: 90



给你一个字符串,问你用这些数字能排列出多少种不同的数字能被d整除。

直接状压求出所有能被d整除的排列,然后再除以每个数字出现次数的阶乘,就是答案了。

DP的时候优化一点,就不会超时了。


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 1e9
#define endl '\n'
#define mod 100000007
#define LL long longusing namespace std;int dp[1100][1100];int main(void)
{int T,n,d,i,j,k;scanf("%d",&T);char s[15];int f[15],a[15],num[15];int cas =  1;f[0] = 1;for(i=1;i<=10;i++)f[i] = f[i-1]*i;while(T--){scanf("%s%d",s,&d);n = strlen(s);memset(num,0,sizeof(num));memset(dp,0,sizeof(dp));for(i=0;i<n;i++){a[i] = s[i] - '0';num[a[i]]++;}dp[0][0] = 1;for(i=0;i<(1<<n);i++){for(j=0;j<n;j++){if(i&(1<<j))continue;for(k=0;k<d;k++){if(dp[i][k]==0)continue;dp[i|(1<<j)][(k*10+a[j])%d]+=dp[i][k];}}}int ans = dp[(1<<n)-1][0];for(i=0;i<10;i++)ans /= f[num[i]];printf("Case %d: %d\n",cas++,ans);}return 0;
}


这篇关于lightoj 1158 - Anagram Division的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656979

相关文章

[LeetCode] 399. Evaluate Division

题:https://leetcode.com/problems/evaluate-division/ 题目大意 给定 equations 和式子结果 values ,求 queries 的结果。 思路 dfs 先构建一个图。 queries 是两点之间 边的权重 乘积。 class Solution {double dfs(List<Double> resList,Map<String

LightOJ 1068 Investigation (数位dp)

http://www.lightoj.com/volume_showproblem.php?problem=1068 求出区间[A,B]内能被K整除且各位数字之和也能被K整除的数的个数。(1 ≤ A ≤ B < 231 and 0 < K < 10000) 算是最简单的数位dp了,k在这里是10000,三维数组都开不开。但是想想会发现A,B最多有10位,各位数字之和不会超过90,那么当

lightoj 1050 - Marbles (概率DP)

思路:定义dp[i][j] 为 袋子中有i个红球和j个红球时获胜的概率 那么根据题意我只可以任意拿而对手只拿蓝球。那么 dp[i][j] = (拿到红球的概率) * dp[i-1][j-1] + (拿到蓝球的概率) * dp[i][j-2]; 边界:当红球没有时,获胜的概率为1 注意点:T比较大,需要把所有数据预处理出来直接查询,否则超时 /*********************

lightoj 1047 Neighbor House(Dp)

思路:定义dp[i][j] 为粉刷第i个房子用的颜色j dp[i][j] = min(dp[i-1][(j+1)%3] , dp[i-1][(j+2) % 3]); 一共有三种颜色{0, 1, 2},任取一种颜色{j},那么和颜色j不同的颜色就为{(j + 1) % 3 , (j + 2) % 3}; /******************************************

lightoj 1044 Palindrome Partitioning(dp)

题意:给定字符串S,问可以划分的最小回文串数量 思路:定义dp[i]为以i开头的字符串中回文串的最小划分数. dp[i] = min(dp[j] + 1 | i <= j < n && S[i...j]是回文串) 边界,dp[i] = n-i+1. /************************************************ Author: fisty* Crea

lightoj 1037 - Agent 47 (状压DP)

题意:你现在需要消灭n个敌人,n个敌人的血量已知,你的普通攻击力为1,但是如果你杀死敌人i可以用它的武器去杀死其他敌人,p[i][j] 表示用敌人i的武器射杀敌人j会减p[i][j]滴血.问你最少可以攻击多少次可以将敌人杀死。 思路: 定义集合s为死亡敌人的集合。 dp[s] 为让集合为s的人死亡最小需要的攻击次数。 如果现在想要消灭敌人i 并且敌人i不属于s 那么dp[s | (1<<

lightoj 1032 - Fast Bit Calculations (数位DP)

记忆花搜索:dp[len][num][last] : 现在处理第len位,前面有num个11,并且最后一位为last。 /************************************************ Author: fisty* Created Time: 2015-08-18 20:18:09* File Name : 1032.cpp***************

Mysql 报错 1365 - Division by 0

Mysql 报错 1365 - Division by 0 解决办法 直接运行一下命令 set sql_mode=(select REPLACE(@@sql_mode,'ERROR_FOR_DIVISION_BY_ZERO',''));

LeetCode --- Valid Anagram解题分析

题目描述:给定两个字符串,判断是否是字谜游戏。比如:   s = "anagram", t = "nagaram", return true.s = "rat", t = "car", return false.   解题思路一:只要字符串中所有字母出现次数相同即可判定是字谜游戏,所以统计两字符串各字符出现的次数,如果都相同则返回true,否则返回false: bool isAnagr

553. Optimal Division 最优除法

https://leetcode-cn.com/problems/optimal-division/description/ 思路:x1/x2/…/xn,无论在之间加多少个括号,x1总是作为被除数,x2总是作为除数,因此结果最大的做法是将x3到xn的所有除法转换为乘法,即x1/(x2/…/xn)=x1/x2*x3*…*xn. string optimalDivision(vector<int>