我自己推出来的柿子是向上取整,写成代码是这样:
L = ceil(L, k);//
H = H / k;
ll ans = 0;
for(int l = 1, r; l <= H; l = r + 1)
{
r = H / (H / l);
if(L / l) r = min(r, L / (L / l));
ll sMy = My(r) - My(l - 1);
ll pow = (H / l) - ceil(L, l) + 1;//
pow = qp(pow, n);
ans += (sMy + Md) % Md * pow % Md;
ans %= Md;
}
其中ceil函数是
inline int ceil(int a, int b)
{
if(a % b) return (a / b) + 1;
return a / b;
}
但是这样只有80分,这是为什么啊?
题解给出的是这样:
L = (L - 1) / k;//
H = H / k;
ll ans = 0;
for(int l = 1, r; l <= H; l = r + 1)
{
r = H / (H / l);
if(L / l) r = min(r, L / (L / l));
ll sMy = My(r) - My(l - 1);
ll pow = (H / l) - (L / l);//
pow = qp(pow, n);
ans += (sMy + Md) % Md * pow % Md;
ans %= Md;
}
为什么这样就能AC
不同之处用//标出了。