专栏文章
题解:CF776E The Holmes Children
CF776E题解参与者 3已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @miorugsi
- 此快照首次捕获于
- 2025/12/03 00:07 3 个月前
- 此快照最后确认于
- 2025/12/03 00:07 3 个月前
这题目前中文翻译疑似不太有素质,答案要对 取模。
容易发现 ,也就是 中与 互质的元素个数。
证明:首先理解方括号 。这是艾弗森括号,当 为真时值为 否则为 。那么 代表什么?我们有 ,反用就得到了 。所以是 。而 和 必定不互质(因为 , 是显然成立的),所以把求和上界改为 不会导致任何问题。
容易发现 。
证明:积性,不证。一个数因子的积性函数和还是积性函数。所以 是积性的。当 时因子有 ,而 ,,求和得到 ,对于质数的幂证毕,所以对于所有的 都成立。其实这个有很多种证法。
所以我们得到:
显然当 的时候可以直接减去 。
从而可以得到,,其中 是函数迭代记号,也就是 ,共有 层。
计算 有一种简单的方法,考虑其质因子分解,假设质数为 ,而 。
证明:积性。然后证毕。
可以在 的时间复杂度之内计算出质因子分解,所以可以在相同的时间复杂度之内计算出 函数值。
然而 可能很大,我们的算法是 的。
但是我们发现不停求 很容易就变为 了。这时我们发现只要判断 中途退出就能过。为什么?
当 为奇数且 时,我们有 为偶数。我们把求 的式子中 转化为 ,显然一个数所有质因子的乘积是自身的因子,所以如果分母上是偶数则整个式子都是偶数。而 如果为偶数则 为偶数,矛盾。所以 是偶数。
当 为偶数时, 的后面一串乘积中有 ,而 ,所以 (实际上当 时取等)。顺便可以证明 为偶数(除非 。证法是如果 则显然。否则 必然有非 质因子,仿照我们证明 为奇数时的过程即可)。
所以显然迭代次数是 级别的。这样我们就放心了。作为娱乐,我们还可以干得更精确一些,可以得到:
- 刚开始可能有一次迭代,把 变为偶数。这个过程进行 次。
- 此后 一直是偶数(除了最后 ),每次至少减半。这个过程进行 次。
最终会迭代最多 次。
CPP#include <cstdio>
using namespace std;
long long getphi(long long x)
{
long long res = x;
for(long long i=2;i*i<=x;i++)
{
if(x%i==0)
{
while(x%i==0) x/=i;
res = res / i * (i-1);
}
}
if(x != 1) res = res / x * (x-1);
return res;
}
int main()
{
long long n, k;
scanf("%lld%lld", &n, &k);
k = (k+1)/2;
while(k-- && n != 1)
{
n = getphi(n);
}
printf("%lld\n", n % 1000000007);
return 0;
}
sub。
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...