1. 程式人生 > >RXD and math(HDU 6063 快速冪)

RXD and math(HDU 6063 快速冪)

RXD and math

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 293    Accepted Submission(s): 150

Problem Description RXD is a good mathematician.
One day he wants to calculate:
i=1nkμ2(i)×nki
output the answer module 109+7.
1n,k1018
μ(n)=1
(n=1)

μ(n)=(1)k(n=p1p2pk)
μ(n)=0(otherwise)
p1,p2,p3pk are different prime numbers

Input There are several test cases, please keep reading until EOF.
There are exact 10000 cases.
For each test case, there are 2 numbers n,k.
Output For each test case, output "Case #x: y", which means the test case number and the answer.
Sample Input 10 10
Sample Output Case #1: 999999937  //題意
:已知n,k,求表示式的值。
//思路:那個μ(n)是莫比烏斯函式,p代表的是質數,具體瞭解自行百度。 這題屬於找規律,算幾個就能發現規律: n^k=2:所求值=2; n^k=3:所求值=3; n^k=4:所求值=4; n^k=5:所求值=5; ...... n^k:所求值n^k; 這題就是求(n^k)%(1e9+7),套個快速冪即可。不過快速冪裡有個細節要注意,程式碼裡已標註。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

typedef long long ll;

const ll MOD = 1e9 + 7;

ll n, k;

ll multiply(ll a, ll b)
{
	ll ans = 1;
	while (b)
	{
		if (b & 1)
		{
			ans = ((ans%MOD)*(a%MOD)) % MOD;
			b--;
		}
		b /= 2;
		//注意這裡a要先%MOD,不然第一次a*a會超過long long,會WA!!!
		a = ((a%MOD)*(a%MOD)) % MOD;
	}
	return ans;
}

int main()
{
	int Case = 1;
	while (scanf("%lld%lld", &n, &k) != EOF)
	{
		ll sum = multiply(n, k);
		printf("Case #%d: %lld\n", Case++, sum%MOD);
	}
	return 0;
}