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, modulo m.
Number x is considered close to number n modulo m, if:
- it can be obtained by rearranging the digits of number n,
- it doesn't have any leading zeroes,
- the remainder after dividing number x by 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 (1 ≤ n < 1018) and m (1 ≤ m ≤ 100).
In a single line print a single integer — the number of numbers close to number n modulo 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.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 18
#define LL long long int
LL dp[1<<maxn][102];
LL digit[maxn];
LL base[maxn];
LL f[maxn];
int main()
{
LL n,m;
while(scanf("%I64d%I64d",&n,&m)==2)
{
memset(base,0,sizeof(base));
memset(dp,0,sizeof(dp));
int num = 0;
while(n)
{
digit[num] = n%10;
num++;
base[n%10]++;
n /= 10;
}
n = num;
f[0] = 1;
for(int i = 1;i < maxn;i++)
{
f[i] = f[i-1] * i;
}
LL repeat = 1;
for(int i = 0;i < 10;i++)
{
repeat *= f[base[i]];
}
for(int i = 0;i < n;i++)
{
if(digit[i])
{
dp[1<<i][digit[i]%m] = 1;
}
}
for(int i = 1;i < (1<<n);i++)
{
for(int j = 0;j < m;j++)
{
if(dp[i][j] == 0) continue;
for(int k = 0;k < n;k++)
{
if((i & (1<<k)) == 0)
{
dp[i | (1<<k)][(j*10+digit[k])%m] += dp[i][j];
}
}
}
}
printf("%I64d\n",dp[(1<<n)-1][0]/repeat);
}
return 0;
}
解决数学问题:找出与给定数字最接近的数,模运算条件下
本博客详细介绍了如何通过数学逻辑找到与给定数字n,在模m条件下最接近的数字的数量。通过算法实现,解决了在特定条件下的数字匹配问题。
9275

被折叠的 条评论
为什么被折叠?



