HDU 6063 RXD and math (打表)

Mr_Treeeee發表於2020-04-06

RXD and math

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


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
 

Source
 

題意:
有一個莫比烏斯函式,就是每當μ2(i)的i含平方因子時,等於0,其他都等於1。

POINT:
對於know nothing的我,只能打表了。

//#include <iostream>
//#include <stdio.h>
//#include <string.h>
//#include <math.h>
//#include <algorithm>
//using namespace std;
//#define LL long long
//const LL N = 10000000+6;
//LL f[N];
//void init()
//{
//    for(LL i=1;i<=N;i++)
//    {
//        f[i]=1;
//    }
//    for(LL i=2;i<=sqrt(N);i++)
//    {
//        if(f[i]==0) continue;
//        LL now=i*i;
//        for(LL j=now;j<=N;j+=now)
//        {
//            f[j]=0;
//        }
//    }
//
//}
//void dfs(LL n,LL k)
//{
//    LL ans=0;
//    for(LL i=1;i<=(LL)pow(n,k);i++)
//    {
//        ans+=f[i]*(LL)floor(sqrt(pow(n,k)/(1.0*i)));
//    }
//    printf("n:%lld k:%lld ans:%lld\n",n,k,ans);
//}
//int main()
//{
//    init();
//    for(LL n=1;n<=10;n++)
//    {
//        for(LL k=1;k<=7;k++)
//        {
//
//                dfs(n,k);
//        }
//        }
//
//
//}
//
//#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL long long
const LL p = 1e9+7;
LL qkm(LL base,LL mi)
{
    LL ans=1;
    while(mi)
    {
        if(mi&1) ans*=base;
        base*=base;
        ans%=p;
        base%=p;
        mi>>=1;
    }
    return ans;
}
int main()
{
    LL n,k;
    int o=0;
    while(~scanf("%lld %lld",&n,&k))
    {
        n%=p;
        LL ans=qkm(n,k);
        printf("Case #%d: %lld\n",++o,ans);
    }
}