2012-06-22 49 views
1

大家解決方案的數量,這是在參考,這一問題:http://www.spoj.pl/problems/DCEPC702 /.(Kindly看到有一個樣本輸入)。我翻譯的問題陳述這個尋找解決方案的數量,這種形式na + nb + nc <= newN newN = N - (mina + minb + minc)的方程,到+ B + C <= N

0<=na<=maxa - mina, 0<=nb<=maxb-minb, 0<=nc<=maxc-minc

我已經然後試圖容斥找到解決方案的數量。我對這個原則很陌生,因此我不確定我是否做得對。反正我的回答是不正確的。有人能告訴我在這種方法中我錯了嗎?這是我的代碼。

在此先感謝。

#include<iostream> 
#include<cstdio> 
using namespace std; 
#define MOD 1000000007 

#define ulli long long int 

ulli f(int a) 
{ 
if(a<0) return 0; 
else 
{ 
    ulli n = (ulli)a; 
    return ((((n+3)*(n+2)*(n+1))/6))%MOD; 
} 
} 


int N; 

int minA, maxA; 
int minB, maxB; 
int minC, maxC; 

    int main() 
{ 
    int T; 

scanf("%d",&T); 

while(T--) 
{ 
    scanf("%d",&N); 

    scanf("%d %d",&minA , &maxA); 
    scanf("%d %d",&minB , &maxB); 
    scanf("%d %d",&minC , &maxC); 

    maxA -= minA; 
    maxB -= minB; 
    maxC -= minC; 

    int A = maxA; 
    int B = maxB; 
    int C = maxC; 

    N -= (minA + minB + minC); 


    ulli res = f(N) -f(N-A-1)-f(N-B-1)-f(N-C-1)+f(N-A-B-2)+f(N-C-B-2)+f(N-A-C-2)-f(N-A-B-C-3); 

    cout<<res%MOD<<endl; 
} 


return 0; 
} 
+0

我想你應該添加到這個問題:「所有的約束都達到10^9。TL是1000個測試用例1」 – kilotaras

回答

1

你應該通過一些簡單的例子來看看你會出錯的地方。

一個明顯的問題:您對於f式爲(N + 3)選擇3;它應該是(N + 2)選擇2.(如果總共有N個,則添加2個分隔符,並選擇這兩個分隔符的位置。)

其餘一些代碼不清楚,但是正確。我會做這樣的事情:

int A = maxA - minA; 

而不是

maxA -= minA; 
int A = maxA; 

另外,還有一些潛在的溢出錯誤,這取決於數字有多大 - 這三個數字,然後由6分乘以你之前可能溢出去mod。你應該能夠做的就是找出其中三個由3整除,並劃分了這一點,然後再來哪個(些)是2 /整除,並劃分出的一個因素。乘以兩個結果,對其進行修改,然後乘以最終結果並對其進行修改。

哦,國防部最終的答案也一樣,我覺得這個問題問什麼。

相關問題