Я пытаюсь вычислить ncr (комбинации) в c, используя dp. Но он терпит неудачу при n = 70. Может ли кто-нибудь помочь?ncr in c (комбинации)
unsigned long long ncr(int n , int r)
{
unsigned long long c[1001];
int i=1;
c[0]=1;
for(i=1; i<=r; i++)
c[i]= ((unsigned long long) (c[i-1]) * (unsigned long long)(n-i+1))%(unsigned long long) (1000000007)/ (unsigned long long)(i);
return c[r];
}
Основная идея заключается в NCR = ((п-г + 1)/г) * пс (г-1)
Извините, я использовал следующее в действительном коде (взял mod of ans): c [i] = ((unsigned long long) (c [i-1]) * (без знака длинный) (n-i + 1))% (unsigned long long) (1000000007)/(без знака длинный) (i); – bhavneet
Но вам все равно нужно вычислить C (n, p) в бигномах, а затем взять модуль «1000000007», который является большим простым числом (поэтому все цифры или биты C (n, p) необходимы для получения модуля). Вы действительно не можете избежать bignums в вашем случае .... –
@bhavneet Чтобы вычислить 'nCr% p', вы не должны делить на' i', вы должны умножаться с его модульным обратным. Также [здесь] (http://stackoverflow.com/a/10862881/1011995). –