【数论】HDU5597 GTW likes function 的详细证明

文章讨论了一个关于数论的递归函数(f_n(x)),证明了(f(x)=x+1),并给出了计算(varphi(f_n(x)))的方法,其中(varphi)是欧拉函数。通过递推关系简化了计算过程,最后提供了一个C++代码片段用于求解给定输入的欧拉函数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【数论】

已知 f 0 ( x ) = ∑ k = 0 x ( − 1 ) k ⋅ 2 2 x − 2 k ⋅ C 2 x − k + 1 k f_0(x)=\sum\limits_{k=0}^x(-1)^k\cdot 2^{2x-2k}\cdot\text C_{2x-k+1}^k f0(x)=k=0x(1)k22x2kC2xk+1k,且对于 n ≥ 1 n\ge1 n1,有 f n ( x ) = f 0 ( f n − 1 ( x ) ) f_n(x)=f_0(f_{n-1}(x)) fn(x)=f0(fn1(x))

T   ( 1 ≤ T ≤ 1 0 3 ) T\ (1\le T\le 10^3) T (1T103) 组数据,给定 n , x   ( 1 ≤ n , x ≤ 1 0 12 ) n,x\ (1\le n,x\le 10^{12}) n,x (1n,x1012),求 φ ( f n ( x ) ) \varphi(f_n(x)) φ(fn(x))

建议改为:【模板】求 φ ( x ) \varphi(x) φ(x)

先证 f ( x ) = x + 1 f(x)=x+1 f(x)=x+1(这里 f f f 默认指 f 0 f_0 f0):

【证明】 首先,

f ( n ) = ∑ k = 0 n ( − 1 ) k ⋅ 2 2 n − 2 k ⋅ C 2 n − k + 1 k = ∑ k = 0 n ( − 1 ) k ⋅ 2 2 n − 2 k ⋅ ( C 2 n − k k + C 2 n − k k − 1 ) = ∑ k = 0 n ( − 1 ) k ⋅ 2 2 n − 2 k ⋅ C 2 n − k k − ∑ k = 0 n − 1 ( − 1 ) k ⋅ 2 2 ( n − 1 ) − 2 k ⋅ C 2 ( n − 1 ) − k + 1 k = ∑ k = 0 n ( − 1 ) k ⋅ 2 2 n − 2 k ⋅ C 2 n − k k − f ( n − 1 ) = g ( n ) − f ( n − 1 ) \begin{aligned} f(n)&=\sum\limits_{k=0}^n(-1)^k\cdot 2^{2n-2k}\cdot\text C_{2n-k+1}^k\\&=\sum\limits_{k=0}^n(-1)^k\cdot 2^{2n-2k}\cdot\left(\text C_{2n-k}^k+\text C_{2n-k}^{k-1}\right)\\&=\sum\limits_{k=0}^n(-1)^k\cdot 2^{2n-2k}\cdot\text C_{2n-k}^k-\sum\limits_{k=0}^{n-1}(-1)^k\cdot 2^{2(n-1)-2k}\cdot\text C_{2(n-1)-k+1}^{k}\\&=\sum\limits_{k=0}^n(-1)^k\cdot 2^{2n-2k}\cdot\text C_{2n-k}^k-f(n-1)\\&=g(n)-f(n-1) \end{aligned} f(n)=k=0n(1)k22n2kC2nk+1k=k=0n(1)k22n2k(C2nkk+C2nkk1)=k=0n(1)k22n2kC2nkkk=0n1(1)k22(n1)2kC2(n1)k+1k=k=0n(1)k22n2kC2nkkf(n1)=g(n)f(n1)

另外,下面的关键问题是研究 g ( n ) g(n) g(n),即

g ( n ) = 2 2 n + ∑ k = 1 n − 1 ( − 1 ) k ⋅ 2 2 n − 2 k ⋅ ( C 2 n − k − 1 k + C 2 n − k − 1 k − 1 ) + ( − 1 ) n = ∑ k = 0 n − 1 ( − 1 ) k ⋅ 2 2 n − 2 k ⋅ C 2 n − k − 1 k + ∑ k = 1 n ( − 1 ) k ⋅ 2 2 n − 2 k ⋅ C 2 n − k − 1 k − 1 = 4 ∑ k = 0 n − 1 ( − 1 ) k ⋅ 2 2 ( n − 1 ) − 2 k ⋅ C 2 n − k − 1 k − ∑ k = 0 n − 1 ( − 1 ) k ⋅ 2 2 ( n − 1 ) − 2 k ⋅ C 2 ( n − 1 ) − k k = 4 f ( n − 1 ) − g ( n − 1 ) \begin{aligned} g(n)&=2^{2n}+\sum\limits_{k=1}^{n-1}(-1)^k\cdot 2^{2n-2k}\cdot\left(\text C_{2n-k-1}^k+\text C_{2n-k-1}^{k-1}\right)+(-1)^n\\&=\sum_{k=0}^{n-1}(-1)^k\cdot 2^{2n-2k}\cdot\text C_{2n-k-1}^k+\sum_{k=1}^n(-1)^k\cdot 2^{2n-2k}\cdot\text C_{2n-k-1}^{k-1}\\&=4\sum_{k=0}^{n-1}(-1)^k\cdot 2^{2(n-1)-2k}\cdot\text C_{2n-k-1}^k-\sum_{k=0}^{n-1}(-1)^k\cdot 2^{2(n-1)-2k}\cdot\text C_{2(n-1)-k}^{k}\\&=4f(n-1)-g(n-1) \end{aligned} g(n)=22n+k=1n1(1)k22n2k(C2nk1k+C2nk1k1)+(1)n=k=0n1(1)k22n2kC2nk1k+k=1n(1)k22n2kC2nk1k1=4k=0n1(1)k22(n1)2kC2nk1kk=0n1(1)k22(n1)2kC2(n1)kk=4f(n1)g(n1)

联立上述两式,易得 f ( x ) − f ( x − 1 ) = C f(x)-f(x-1)=C f(x)f(x1)=C(常数)。

考虑到 f ( 0 ) = 1 , f ( 1 ) = 2 f(0)=1,f(1)=2 f(0)=1,f(1)=2,所以 f ( x ) = x + 1 f(x)=x+1 f(x)=x+1,证毕。

所以 f n ( x ) = x + n + 1 f_n(x)=x+n+1 fn(x)=x+n+1

直接求就可以了,理论复杂度 O ( T x ) O(T\sqrt{x}) O(Tx ),实际上跑不满。

#include <cstdio>
#include <algorithm>
#include <cstring>

#define N 1000010
#define ll long long

using namespace std;

inline ll rd(){
	char c;
	bool flag = false;
	while((c = getchar()) < '0' || c > '9')
	    if(c == '-') flag = true;
	ll res = c - '0';
	while((c = getchar()) >= '0' && c <= '9')
	    res = (res << 3) + (res << 1) + c - '0';
	return flag ? -res : res;
}

inline ll phi(ll n) {
	ll ans = n;
	for(ll i = 2 ; i * i <= n ; i++)
		if(n % i == 0){
		ans = ans / i * (i - 1);
		while(n % i == 0) n /= i;
	}
	if(n > 1) ans = ans / n * (n - 1);
	return ans;
}

ll x, n;

int main(){
    while(~scanf("%lld%lld", &x, &n))
        printf("%lld\n", phi(x + n + 1));
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值