下記のリンクの問題を解いていたのですが,sampleケースが両方通って他のケースは一つがWA,残りはTLEとなってしまいました.while文も終了条件はきちんとできていますし,for文もそこまで計算量があるようには思えません.あるとしたら組み合わせを求めているところかなと思うのですが,ここはどのようにしたら高速化できますでしょうか.
問題
C
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#include<math.h> 5 6double nPm(int n,int m){ 7 if(m<=1) return (double)n; 8 return (n-m+1)*(nPm(n,m-1)); 9} 10 11double nCm(int n,int m){ 12 return nPm(n,m)/nPm(m,m); 13} 14 15 16int main(void){ 17 int N,M; 18 int *r; 19 20 scanf("%d %d",&N,&M); 21 22 r=(int *)malloc(sizeof(int)*M); 23 24 for(int i=0;i<M;i++) scanf("%d",&r[i]); 25 26 double p=1/(double)M; 27 28 double P=1; 29 30 double LOG10=N*log10(p); 31 32 //printf("p=%f\n",p); 33 34 int A=N; 35 for(int i=0;i<M;i++){ 36 P=nCm(A,r[i]); 37 LOG10+=log10(P); 38 A-=r[i]; 39 } 40 41 //printf("P=%f\n",P); 42 43 int ans=0; 44 double divide=1.0; 45 while(1){ 46 if(LOG10>=log10(divide)) break; 47 divide/=10; 48 ans++; 49 } 50 51 printf("%d\n",ans); 52 return 0; 53}
回答3件
あなたの回答
tips
プレビュー