hdu 1261 排列组合&&大数除法

唉  不知道第一次发什么神经 第一次把t定义成char 型的了

小数还对 大数就不多了、、、找了半个小时才找到  以后要细心了

求大数 一定是用字符串保存,,long long 肯定溢出。

具体思路就是把所有字符个数加起来的阶乘n!除以各个字符出现的个数的阶乘。

#include <stdio.h>
#include <string.h>
#define num 1000
int main()
{
    char str[num];
    long long  n,x,count,j,i,q,sum,a[30],t,k;
    while(scanf("%lld",&n)!=EOF&&n)
    {
        memset(str,0,sizeof(str));
        str[0]=1;
        count=0;
        for(i=0;i<n;i++)
        {
            scanf("%lld",&x);
            sum=1;
            for(j=2;j<=x;j++)//计算各个字符的个数阶乘
            sum=sum*j;
            a[i]=sum;
            count+=x;//求字符总个数。
        }
        for(i=2;i<=count;i++)//大数阶乘。count
        {
            for(q=0,t=0;q<num;q++)
            {
                k=str[q]*i+t;
                str[q]=k%10;
                t=k/10;
            }
        }
        for(i=num-1;i>=0;i--)
        if(str[i]!=0)
        break;
        for(q=0;q<n;q++)
        {
            sum=0;
            for(j=i;j>=0;j--)//大数除以小数,字符串模拟除法过程。大胆的除吧  肯定能整除。
            {
                t=(sum*10+str[j])/a[q];
                sum=(sum*10+str[j])%a[q];
                str[j]=t;
            }
        }
        for(i=num-1;i>=0;i--)
        if(str[i]!=0)
        break;
        for(q=i;q>=0;q--)
        printf("%d",str[q]);
        printf("\n");
    }
    return 0;
}
时间: 2024-08-30 01:38:14

hdu 1261 排列组合&&大数除法的相关文章

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

hdu 5366 排列组合

http://acm.hdu.edu.cn/showproblem.php?pid=5366 Problem Description ![](../../data/images/C613-1001-1.jpg) ZJiaQ want to become a strong man, so he decided to play the mook jong.ZJiaQ want to put some mook jongs in his backyard. His backyard consist o

HDU 1521 排列组合 搜索

排列组合 Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种. Input 每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量. Output 对应每组数据输出排列数.(任何运算不会超出2^31的范围) Sample Input 2 2 1 1 Sa

HDU - 1261-字串数 (排列组合+大数)

一个A和两个B一共可以组成三种字符串:"ABB","BAB","BBA". 给定若干字母和它们相应的个数,计算一共可以组成多少个不同的字符串. Input每组测试数据分两行,第一行为n(1<=n<=26),表示不同字母的个数,第二行为n个数A1,A2,...,An(1<=Ai<=12),表示每种字母的个数.测试数据以n=0为结束. Output对于每一组测试数据,输出一个m,表示一共有多少种字符串. Sample Inpu

HDU 1521 排列组合 指数型母函数

指数型生成函数公式(其中一个): #include<iostream> #include<string.h> #include<stdio.h> using namespace std; #define M 15 double fac[M]; void fun()//求n的阶乘 函数 { int i; fac[0]=1; for(i=1;i<=10;i++) fac[i]=i*fac[i-1]; } int main() { int n,m; int z[M];

hdu 4535(排列组合之错排公式)

吉哥系列故事——礼尚往来 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1417    Accepted Submission(s): 733 Problem Description 吉哥还是那个吉哥 那个江湖人称“叽叽哥”的基哥 每当节日来临,女友众多的叽叽哥总是能从全国各地的女友那里收到各种礼物. 有礼物收到当然值得高兴,但回礼确是

HDU 1521 排列组合

Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种. Input 每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量. Output 对应每组数据输出排列数.(任何运算不会超出2^31的范围) Sample Input 2 2 1 1 Sample

hdu 1521 排列组合 —— 指数型生成函数

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1521 标准的指数型生成函数: WA了好几遍,原来是多组数据啊囧: 注意精度,直接强制转换(int)是舍去小数,会WA,+0.5再强制转换或输出 %.0lf 是四舍五入,能A. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace

组合数学 + 大数乘法 + 大数除法 之 hdu 1261 字串数

//  [3/17/2015 JmingS] /* 此题可直接推导出公式: {(A1+A2+……+An)!} / {A1!A2!……An!} 由于 (12×26)! = 312! 只能通过数组来存储,所以又涉及『大数乘法』和『大数除法』, 大数实现的主要思想模拟手算,具体参考程序. */ 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5