podawane trzy liczby całkowite n
, k
i d
, ile sposobów można n
być reprezentowany jako suma liczb całkowitych dodatnich i<=k
, tak że d
występuje przynajmniej raz w sumie. Jest oczywiste, że 0<d<=k
. Moje podejście było rekurencyjne;Skuteczny sposób na znalezienie liczbę kwot możliwych
#include <stdio.h>
#include <stdlib.h>
int n,k,d,ans=0;
void solve(int totw,int flag)//totw is the total sum till now, and flag is to keep track of the number of d's in the sum.
{
if(totw>n)
return;
if(totw==n && flag>0)//flag>0--->at least 1 d
{
ans = (ans+1)%1000000007;//answer is expected modulo 10^9+7
return;
}
int i=1,h=k;
if(h>n-totw)
h=n-totw;
while(i<=h)
{
if(i==d)
flag++;
solve(totw+i,flag);
i++;
}
}
int main()
{
scanf("%d %d %d",&n,&k,&d);
solve(0,0);
printf("%d",ans);
}
Wejście:
wyjściowa:
ale sędzia pokazuje Time Limit Exceeded
. Czy istnieje jakikolwiek skuteczniejszy algorytm postępowania w tym przypadku? 0<n,k<=100
PS: Zastanawiam się, czy istnieje jakiś argument kombinatoryczny, który może rozwiązać to pytanie bez recursion
lub iteration
. I tak ... kolejność kwotsprawa.
Ograniczenia dla n i k? – SergeyS
@SergeyS '0
yobro97
Nie wiem, czy rozumiem poprawnie, ale nie jest to problem taki sam jak obliczanie liczby sposobów (nd) może być reprezentowana jako suma liczb całkowitych gdzie i <= k -1? –