出题人如是说道
做不出这个题可能是不知道逆元,这里介绍逆元的最简单的求法:费马小定理。
其他的移步大佬微博:点这里
公式就一个:
p
−
1
p ^ { -1}
p−1
=
=
=
p
m
o
d
−
2
p^{mod - 2}
pmod−2 推导点这里
实现起来是这样的:
比如答案让你求: ans =
n
p
\frac{n}{p}
pn % mod
=
=
=
n
∗
n *
n∗
p
−
1
p ^ { -1}
p−1 %mod =
n
n
n
∗
*
∗
p
m
o
d
−
2
p^{ mod - 2}
pmod−2
模很大我们就用快速幂实现。
然后就是暴力裸题了。
用pow的话注意下浮点加个eps,预处理 n 3 n^3 n3的话更好。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
typedef long long int ll;
ll mod;
ll qpow(ll x, ll y){
ll ans = 1;
while (y){
if (y & 1)
ans = ans * x % mod;
x = x * x % mod;
y >>= 1;
}
return ans;
}
int main(){
ll q;
cin >> q;
ll n;
cin >> n >> mod;
ll res = 0;
for(ll i = 1;i <= n;i++){
if(i % (ll)(pow((double)i,1.0 / 3) + 0.000001) == 0) res++;
}
printf("%lld\n",(ll)(res * qpow(n,mod - 2)) % mod);
}