SWexpertAcademy

7965. 퀴즈

먼지의삶 2019. 7. 12. 23:36
#include<cstdio>

int t;
unsigned long long d[1000001];

unsigned long long z(unsigned long long n, unsigned long long exp) {
	
	unsigned long long ans = 1;
	while (exp) {
		if (exp & 1) {
			ans = (ans * n);
			ans = ans % 1000000007;
		}
		n *= n;
		n %= 1000000007;
		exp >>= 1;
	}
	return ans % 1000000007;
}//고속 제곱 함수

int main() {
	scanf("%d", &t);
	int n = 1;
	d[1] = 1;
	for (unsigned long long i = 2; i <= 1000000; i++) {
		d[i] = (d[i - 1] % 1000000007 + z(i, i) % 1000000007) % 1000000007;
	}



	while (t--) {
		int x;
		scanf("%d", &x);
		
		
		
		
		printf("#%d %lld\n", n, d[x]);
		n++;
	}
	return 0;
}

고속 제곱함수 어떻게 해야될지 너무막막해서 그냥한번 찾아서 풀어본문제