2017 Multi-University Training Contest - Team 3——HDU6063 RXD and math
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6063
题目意思:字面意思,给出n,k,算出这个式子的答案。
思路:比赛的时候是打表找规律过了,赛后仔细研究一下数学上的具体做法,首先莫比乌斯函数,就是他后面给的那个式子μ(n)=(−1)k(n=p1p2…pk) p1,p2,p3…pk是互不相同的的素数。满足这个条件的n,μ^2(n)=1,否则μ^2(n)=0;从这个定义里面我们发现所有满足μ^2(n)=0的n值必定满足n=a^2*b,其中μ^2(b)=1。我们建立一个这样不等式a^2*b<=n;变形以后得到a<=sqrt(n/b)。很明显如果a取整数,那么a可以等于1,2,3,4,5……floor(sqrt(n/b)),共floor(sqrt(n/b))项,满足任何一项的的莫比乌斯函数等于0的。所以每一个莫比乌斯函数的平方等于1的数乘上floor(sqrt((n/i))),相当于把后面因为他被而变成0的项给补上了。所以相当于每一项的值都是1,所以这个式子的答案就是n,至于给n^k完全就是为了,让你推出这个公式以后,考一下你快速幂姿势。
代码:
1 //Author: xiaowuga 2 #include <iostream> 3 #include <algorithm> 4 #include <set> 5 #include <vector> 6 #include <queue> 7 #include <cmath> 8 #include <cstring> 9 #include <cstdio> 10 #include <ctime> 11 #include <map> 12 #include <bitset> 13 #include <cctype> 14 #define maxx INT_MAX 15 #define minn INT_MIN 16 #define inf 0x3f3f3f3f 17 #define mem(s,ch) memset(s,ch,sizeof(s)) 18 #define nc cout<<"nc"<<endl 19 const long long mod=1e9+7; 20 using namespace std; 21 typedef long long LL; 22 LL q_power(LL a,LL k){ 23 LL ans=1; 24 a%=mod; 25 while(k){ 26 if(k%2) ans=(ans*a%mod+mod)%mod; 27 k/=2; 28 a=(a*a%mod+mod)%mod; 29 } 30 return ans; 31 } 32 int main() { 33 ios::sync_with_stdio(false);cin.tie(0); 34 LL n,k,ca=0; 35 while(cin>>n>>k){ 36 cout<<"Case #"<<++ca<<": "<<q_power(n,k)%mod<<endl; 37 } 38 return 0; 39 }