2012-06-22 5 views
1

모두의 해답의 수는이 문제와 관련되어 있습니다 : http://www.spoj.pl/problems/DCEPC702/.(샘플 입력에 대해 자세히 알려주십시오). 나는+ b + c <= n <= n

0<=na<=maxa - mina, 0<=nb<=maxb-minb, 0<=nc<=maxc-minc,이 양식 na + nb + nc <= newN newN = N - (mina + minb + 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

"모든 제약 조건은 최대 9^9이며, TL은 1000 개의 테스트 사례에 대해 1s입니다."라는 질문에 추가해야한다고 생각합니다. – kilotaras

답변

1

어디서 잘못 될지 간단하게 살펴보아야합니다.

하나의 명백한 문제 : f에 대한 공식은 (N + 3)은 3을 선택하고, (N + 2)는 2를 선택해야합니다. (N 합계가있는 경우 2 개의 분리 기호를 추가하고 그 두 위치를 선택하십시오.)

나머지 코드 중 일부는 분명하지만 정확합니다. 숫자가 얼마나 큰에 따라 오버플로 오류 가능성이있다, 오히려 또한

maxA -= minA; 
int A = maxA; 

보다

int A = maxA - minA; 

- 전에 오버 플로우 수 후 6로 나누어 세 가지 숫자를 곱 : 내가 좋아하는 뭔가를 할 것입니다 모드로 가라. 당신이 할 수 있어야하는 것은 3의 어느 것이 3으로 나눌 수 있는지를 계산하고, 그것을 나눈 다음, 2로 나눌 수있는 숫자를 그리고 하나의 요인을 나눕니다. 두 개의 결과를 곱해서 mod로하고 최종 결과와 mod를 곱하십시오.

오, 그리고 최종 대답도 역시 문제가되는 것 같습니다.

관련 문제