冗长字符串的排列

时间:2014-01-04 09:21:18

标签: algorithm math

以下是我尝试解决的问题:

  

字符串包含从“0”到“9”的字符。现在找出这个字符串的总可能排列。由于数量可以非常大,输出数模数10 ^ 9 + 7.

     
    

输入:     第一行代表测试用例的数量(T)。     每个测试用例都包含一串数字。     输出:     对于每个测试用例输出所需的结果。

         

限制条件:     T< = 100。字符串长度< = 1000

  

所以,我认为我只需要找出len!其中len是字符串的长度。 我找到阶乘的代码如下:

long long int fact(long long int n)
{
if(n<=1)
return 1;
else
return (len * fact(len-1))%1000000007;
}

但是我一直在为这段代码获得WA。无视输出格式问题,上面的代码是否找到了正确的因子?或者我应该使用不同的方法吗?

注意:我也改变了算法,以便通过将答案除以每个字符出现的阶乘的乘积来处理某些字符的重复。

1 个答案:

答案 0 :(得分:3)

(a)它不仅仅是n!,只有10个可能的数字(在你的字符串中可能更少)。如果我给你字符串"22",那么只会有1个排列。

(b)最终的数字仍然非常大,如果没有bignums,你将无法计算它。但由于你只需要一个数量相当小的数字,你可以使用mod的身份来保持中间数字较小。特别有用的是a * b % k = ((a % k) * (b % k)) % k

希望这足以继续而不会破坏它。