Cod sursa(job #1056901)

Utilizator za_wolfpalianos cristian za_wolf Data 14 decembrie 2013 13:52:22
Problema Ridicare la putere in timp logaritmic Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<stdio.h>
#define EPS 1000000007
#define NMAX 1000001

long long laputere(long long base, long long exp) { 
	long long result = 1; 
	while (exp) { 
		if (exp & 1) result = (result * base) % EPS ;
		exp >>= 1; 
		base = (base * base) % EPS; 
	} 
	return result; 
}

int t, tt;
long long n, k, sol, f;
long long fact[NMAX];
int main() {
	freopen("cabana.in", "r", stdin);
	freopen("cabana.out", "w", stdout);
	f = 1;
	fact[0] = fact[1] = 1;
	for (long i = 2; i < NMAX; ++i) {
		fact[i] = (fact[i - 1] * i) % EPS;
	}

	scanf("%d", &t);
	for (int tt = 1; tt <= t; ++tt) {
		scanf("%lld%lld", &n, &k);
		f = fact[k];
		if (n > k) {
			sol = laputere(fact[k] % EPS , n / k);
			if (n % k != 0)
				sol = sol * (f / fact[k - n % k]);
		} else
			sol = f / fact[k - n];
		printf("%lld\n", sol % EPS);


	}


	return 0;
}