Chương trình C++ gặp lỗi SIGSEGV khi submit bài giải lên spoj

Mình có làm một bài toán trên SPOJ .
Link đề tại đây:


Link code mình làm :
http://codepad.org/sNkseMVA

#include <iostream>
using namespace std;

int main() {
	long n,k,M,gt1=1,gt2=1,gt3=1;
	//cout<<"Nhap n,k,M: "<<endl;
	cin>>n; cin>>k;cin>>M;
	if(k>n) return 0;
	int c[10000];
        int t=0;
	for(int i=1;i<=k;i++){
	//	cout<<"\nNhap so c_"<<i<<": ";
		cin>>c[i];
	}
	for(int i=1;i<=k;i++){
			t = t + c[i];
	}
	int u=n+k-t-1;
	int v=n-t;
	int x=k-1;
	for(int i=2;i<=u;i++){
           gt1=gt1*i;
	}
	for(int i=1;i<=v;i++){
		gt2=gt2*i;
	}
	for(int i=2;i<=x;i++){
           gt3=gt3*i;
	}
	int a = (gt1/(gt2*gt3)) % M ;
	cout<<a;
	return 0;
}

Các cao thủ vào giúp mình xem sao mình lại gặp lỗi này và sửa giúp mình với.
Mình sửa mãi vẫn không được.
Xin cảm ơn .

  1. Đề không nói giới hạn k, có thể k>10000 phần tử. Nên việc khai báo mảng c như vậy có thể sẽ thiếu bộ nhớ
  2. Thuật toán này sẽ bị tràn số. Nên % sau mỗi lần nhân và sử dụng long long để có thể nhân 2 số 109
  3. Đây là một bài tổ hợp thông thường nên có cần thiết mảng c không vì nói chung bạn chỉ quan tâm đến tổng giá trị của chúng để tính kết quả
1 Like

Bạn có thể sửa code giúp mình được không ?
Trình của mình còn Gà quá

Ai chỉ giúp mình với đi :(((((((((((((((((((((((((((

Nghĩ theo hướng lấy t= n- tổng(ci)
thì nhiệm vụ còn lại chỉ là tính số cách tạo thành tổng bằng t ít hơn hoặc bằng k số hạng =))
Đề cho như … ít nhất phải có giới hạn n chứ =))
F[s,c]+=f[s-i,c-1] i =0,s

Thốn =((((
Mãi ko sửa được code đây.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?