Cod sursa(job #1210509)

Utilizator ZenusTudor Costin Razvan Zenus Data 20 iulie 2014 11:08:01
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>

using namespace std;

#define LL long long
#define MOD 1000000007
#define NMAX 1000001

LL N,K,T,i;
LL fact[NMAX];

void Gcd(LL A,LL B,LL &Inv,LL &Ins)
{
    LL HInv=0;

    if (!B)
    {
        Inv=1;
        Ins=0;
        return ;
    }

    Gcd(B,A%B,Inv,Ins);

    HInv=Inv;
    Inv=Ins;
    Ins=HInv-Ins*(A/B);
}

LL invers(LL X)
{
    LL Inv=0,Ins=0;

    Gcd(X,MOD,Inv,Ins);

    while (Inv<0)
    Inv+=MOD;

    return Inv;
}

LL pow(LL X,LL T)
{
    LL ans=1;

    for (LL i=1;i<=T;++i)
    ans=(ans*X)%MOD;

    return ans;
}

LL solve (LL N,LL K)
{
    if (N%K==0)
    return pow(fact[K],N/K);

    return pow(fact[K],N/K+1)*invers(fact[(K-N%K)]);
}

int main()
{
freopen("cabana.in","r",stdin);
freopen("cabana.out","w",stdout);

scanf("%lld",&T);

for (i=2,fact[1]=1;i<NMAX;++i)
fact[i]=(fact[i-1]*i)%MOD;

while (T--)
{
    scanf("%lld%lld",&N,&K);
    printf("%lld\n",solve(N,K));
}

return 0;
}