hdu1261(高精度+组合公式的应用)

题目意思:

给定若干字母和它们相应的个数,计算可以组成多少个不同的字符

http://acm.hdu.edu.cn/showproblem.php?pid=1261

题目分析:

组合公式的直接应用,s!/(ai!) s:字符总数 ai:第i个字符的个数,用数组实现高精度的组合公式

不要直接求是S!的阶乘,那样会超时,需要上下同时求,约去最大公约数,在将剩下的值模拟相乘

AC代码:

/**

*s!/(ai!) s:字符总数 ai:第i个字符的个数

*(高精度)

*/

#include<iostream>

#include<cstring>

#include<algorithm>

using namespace std;

int cmp(int a,int b){

return a>b;

}

int gcd(int a,int b){

if(b==0) return a;

else return gcd(b,a%b);

}

int main()

{

int n,a[30],sum[501];//sun储存结果

int s2[400],b[27][15];//存储i便于计算

while(cin>>n&&n){

int i,j,k;

int s=0;

for(i=1;i<=n;i++){

cin>>a[i];

s+=a[i];

}

for(i=1;i<=s;i++){//记录所有个数

s2[i]=i;

}

for(k=1;k<=n;k++){

for(j=2;j<=a[k];j++){

int m=j;

while(m>1){

for(i=1;i<=s;i++){

int m1=gcd(s2[i],m);

m=m/m1;

s2[i]=s2[i]/m1;

}

}

}

}

memset(sum,0,sizeof(sum));

//cout<<m<<endl;

sum[0]=1;

for(i=1;i<=s;i++){//模拟相乘没有约去的值

//cout<<s2[i]<<" ";

int flag=0;

if(s2[i]!=1) for(j=0;j<=500;j++){

int ss=sum[j]*s2[i]+flag;

sum[j]=ss%10;

flag=ss/10;

}

//s1*=s2[i];

}

for(i=500;!sum[i];i--);

//cout<<i<<endl;

for(j=i;j>=0;j--){

cout<<sum[j];

}

cout<<endl;

}

return 0;

}

时间: 2024-10-06 18:40:51

hdu1261(高精度+组合公式的应用)的相关文章

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

hdu 4927 Series 1(组合+公式)

题目链接:hdu 4927 Series 1 题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 解题思路:n最多才3000,ai最大也才1000,貌似不会超int,但是要注意,有些数不止被计算了一次,最多的数被计算了C(15003000),所以肯定要用高精度处理,那么用o(n2)的复杂度肯定就跪了.其实对于最后的ans,ans=∑i=0n?1C(in?1)?ai?(?1)i+1(类似杨辉三角) import

hdu 1799 (循环多少次?)(排列组合公式)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3051    Accepted Submission(s): 1117 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算

bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)

1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MBSubmit: 803  Solved: 372[Submit][Status][Discuss] Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为了体现自己对主的真诚,他们希望自己的墓地拥有着较高的虔诚度

HDU 4869 Turn the pokers(思维+组合公式+快速幂)

Turn the pokers 大意:给出n次操作,给出m个扑克,然后给出n个操作的个数a[i],每个a[i]代表可以翻的扑克的个数,求最后可能出现的扑克的组合情况. Hint Sample Input: 3 3 3 2 3 For the this example: 0 express face down,1 express face up Initial state 000 The first result:000->111->001->110 The second result:0

排列组合公式

今天在写一个算法的时候用到了排列组合,突然感觉不熟悉了,于是自己搜索了下, 重新复习下,把笔记记下来,便于以后复习. 第一,排列 1)排列的定义,就是指从给定n个数的元素中取出指定r个数的元素,进行排序 2)排列公式 3 公式解读, 总长度为r,第一个人有n-0种选,第二个有n-1种,,,,最后一个有n-(r-1)种(为什么是减去(r-1) 因为到第r个人的时候,发现自己前面有r-1个人已经消耗了r-1个选择了,自己的选择余地变成n-(r-1),这和第一个人发现前面有0个选择已经消耗是一样道理)

杭电 2200 Eddy&#39;s AC难题 (排列组合 公式)用double来表示64位

Eddy's AC难题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3710    Accepted Submission(s): 1741 Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的

简明易懂的理解排列组合公式

说实话,我可能无意识中总是感觉自己数学不好,有时自己稍微陌生的数学内容就尽量的逃避,这哪能行,必须要去面对的.我又不是搞数学的研究,咱只是去应用就行了. 下面是知乎降解排列组合公式比较透彻的一个帖子 https://www.zhihu.com/question/26094736

HDOJ(HDU) 2519 新生晚会(组合公式)

Problem Description 开学了,杭电又迎来了好多新生.ACMer想为新生准备一个节目.来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法? Input 数据的第一行包括一个正整数T,接下来有T组数据,每组数据占一行. 每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30) Output 每组数据输出一个整数,每个输出占一行 Sample Input 5 3 2 5 3 4 4 3 6