RXD and math
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 856 Accepted Submission(s): 468
Problem Description
RXD is a good mathematician.
One day he wants to calculate:
output the answer module 109+7 .
1≤n,k≤1018
p1,p2,p3…pk are different prime numbers
One day he wants to calculate:
∑i=1nkμ2(i)×⌊nki−−−√⌋
output the answer module 109+7 .
1≤n,k≤1018
μ(n)=1(n=1)
μ(n)=(−1)k(n=p1p2…pk)
μ(n)=0(otherwise)
p1,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,k .
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都是10^18,很大,所以找规律,打表打出的(1,1) ,(1,2),(1,3),(1,4)(2,1)(2,2)。。。(10,1),(10,2),(10,3),(10,4)的所有值找出规律,就是求n^k快速幂#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <iostream> #define mod 1000000007 using namespace std; #define ll long long long long pow3(long long a,long long b) { long long ans = 1,base=a%mod;///这里注意取模 while(b) { if(b&1) ans = (ans*base)%mod; base= (base*base)%mod; b>>=1; } return ans; } int main() { long long n,k; int ca=1; while(scanf("%lld %lld",&n,&k)!=EOF) { long long ans=pow3(n,k); printf("Case #%d: %lld\n",ca++,ans); } return 0; }