2014-04-03 64 views
-1

問題分段故障

鑑於N和M德克斯特想知道有多少對A,B(1 < =一個< b < = N)是存在使得(a + b)爲例如,當N = 4且M = 3時,存在兩個可能的對,其總和可以被M整除並且它們是(1,2)和(2,4)。 輸入

第一行輸入包含T(< = 100000),它是測試用例的數量。接下來的T行中的每一行包含兩個整數N(1 < = N < = 10^9)和M(2 < = M < = 10^9)。 輸出

如前所述,每個測試用例輸出一行,即對數(a,b)。

這是codechef提出的問題。提交答案後,我得到分段錯誤error.please幫我用正確的答案。

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int i,t,flag,j,x,k,m[100],n[100]; 
    scanf("%d",&t); 
    for(i=1;i<=t;i++) 
    scanf("%d %d",&n[i],&m[i]); 

    for(x=1;x<=t;x++){ 
    k=1; 
    flag=0; 

    for(i=m[x];i<=((2*n[x])-1);i=(m[x]*k)){ 
     for(j=1;j<=(i/2);j++){ 
     if(((i-j)<=n[x]) && (j!=(i-j))){ 
      flag=flag+1; 
     } 
     } 
     k++; 
    } 
    printf("%d\n",flag); 
    } 
} 
+0

在'gdb'或類似的調試器中運行代碼。它會讓你打印segfault的堆棧軌跡。 –

+0

請更慷慨地使用空格和換行符。你的代碼非常緊湊,幾乎不可能閱讀。這不像你的程序運行速度會變慢,否則你的硬盤空間不足。 –

+0

在C中,數組'a [N]'從索引0開始索引到N-1。因此,習慣用語C通常運行循環'for(i = 0; i

回答

3

根據問題的陳述,T可能高達100000當T高於100,下面的語句

scanf("%d %d",&n[i],&m[i]); 

產生不確定的行爲,因爲這兩個nm在100的尺寸

由於每個測試用例都可以獨立處理,因此您根本不需要nm陣列:r由標量變量mn E放置它們,除去第一for循環,並調用scanf第二循環中:

int i,t,flag,j,x,k,m,n; 
scanf("%d",&t); 
for(x=1;x<=t;x++) { 
    scanf("%d %d", &n, &m); 
    ... 
} 

注:這樣便解決了崩潰,但你需要對獲得的速度工作,你算法到可接受的水平。

+0

thx.now我得到時間限制excedded:'(任何更好的解決方案? – user3424954

+0

@ user3424954你應該能夠通過提供一個封閉的形式回答這個問題來取代最內層的循環:「給定一個數字'n'和一個數字' i'在範圍'1..2 * n-1'中,從'1..n'範圍內有多少個有序對加起來爲'i'?「從計數無序對開始,然後將該數除以2。分別考慮'i <= n'和'i> n'時的情況可能會有所幫助。 – dasblinkenlight