RXD is a good mathematician.
One day he wants to calculate:
∑i=1nkμ2(i)×⌊nki−−−√⌋∑i=1nkμ2(i)×⌊nki⌋
output the answer module 109+7109+7.
1≤n,k≤10181≤n,k≤1018
μ(n)=1(n=1)μ(n)=1(n=1)
μ(n)=(−1)k(n=p1p2…pk)μ(n)=(−1)k(n=p1p2…pk)
μ(n)=0(otherwise)μ(n)=0(otherwise)
p1,p2,p3…pkp1,p2,p3…pk 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,kn,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
打表,代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
#include<map>
using namespace std;
typedef long long ll;
int miu[1000010],v[1000010];
void mobius(int n)
{
for(int i=1; i<=n; i++)
miu[i]=1,v[i]=0;
for(int i=2; i<=n; i++)
{
if(v[i])
continue;
miu[i]=-1;
for(int j=2*i; j<=n; j+=i)
{
v[j]=1;
if((j/i)%i==0)
miu[j]=0;
else
miu[j]*=-1;
}
}
}
int main()
{
mobius(1e6);
int n,k;
while(cin>>n>>k)
{
int ans=0;
for(int i=1; i<=pow(n,k); i++)
{
ans+=miu[i]*miu[i]*floor(sqrt(pow(n,k)/i));
}
cout<<ans<<endl;
}
return 0;
}
打表结果:
显而易见,答案为n的k次幂,代码如下:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
#include<map>
using namespace std;
typedef long long ll;
#define mod 1000000007
ll power(ll a,ll b,ll p)
{
ll ans=1%p;
for(; b; b>>=1)
{
if(b&1)
ans=ans*a%p;
a=a*a%p;
}
return ans;
}
int main()
{
ll n,k,g=1;
while(scanf("%lld%lld",&n,&k)!=EOF)
{
n=n%mod;
printf("Case #%lld: %lld\n",g++,(power(n,k,mod)+mod)%mod);
}
return 0;
}