hdu6063 RXD and math(数学/打表)

来源:互联网 发布:java int转char数组 编辑:程序博客网 时间:2024/05/29 19:48

题目链接

题解(伪):可以打表找下规律,就会发现答案为n^k,直接快速幂即可

正解:注意到一个数字xx必然会被唯一表示成a^2\times ba2×b的形式.其中|\mu(b)| = 1μ(b)=1。 所以这个式子会把[1, n^k][1,nk]的每个整数恰好算一次. 所以答案就是n^knk,快速幂即可. 时间复杂度O(\log k)O(logk).

代码如下:

#include <bits/stdc++.h>#define ll long longusing namespace std;const ll MOD = 1e9 + 7;ll x,k;ll q_pow(ll x, ll k){ll res = 1;while(k > 0){if(k & 1) res = res * x % MOD;x = x * x % MOD;k >>= 1;}return res;}int main(){int kase = 0;while(~scanf("%lld%lld",&x,&k)){x %= MOD;printf("Case #%d: %lld\n",++kase,q_pow(x,k));}return 0;}