Cod sursa(job #1300839)

Utilizator ZenusTudor Costin Razvan Zenus Data 24 decembrie 2014 23:49:57
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <cstdio>

using namespace std;

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

LL N,K,T,i;
int ins;
int fact[NMAX],inv[NMAX];

int SQR(int value)
{
    return (1LL*value*value)%MOD;
}

int lgPut(LL N,LL P)
{
    int i,sol=1;

    for (i=0;(1LL<<i)<=P;++i)
    {
        if ( ((1<<i) & P)>0 ) sol=(1LL*sol*N)%MOD;
        N=(N*N)%MOD;
    }

    return sol;
}

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

    return (1LL*lgPut(fact[K],N/K+1)*lgPut(fact[K-N%K],MOD-2))%MOD;
}

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

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

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

return 0;
}