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

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

【数论】

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

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

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

先证 f(x)=x+1f(x)=x+1f(x)=x+1(这里 fff 默认指 f0f_0f0):

【证明】 首先,

f(n)=∑k=0n(−1)k⋅22n−2k⋅C2n−k+1k=∑k=0n(−1)k⋅22n−2k⋅(C2n−kk+C2n−kk−1)=∑k=0n(−1)k⋅22n−2k⋅C2n−kk−∑k=0n−1(−1)k⋅22(n−1)−2k⋅C2(n−1)−k+1k=∑k=0n(−1)k⋅22n−2k⋅C2n−kk−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)=22n+∑k=1n−1(−1)k⋅22n−2k⋅(C2n−k−1k+C2n−k−1k−1)+(−1)n=∑k=0n−1(−1)k⋅22n−2k⋅C2n−k−1k+∑k=1n(−1)k⋅22n−2k⋅C2n−k−1k−1=4∑k=0n−1(−1)k⋅22(n−1)−2k⋅C2n−k−1k−∑k=0n−1(−1)k⋅22(n−1)−2k⋅C2(n−1)−kk=4f(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)=Cf(x)-f(x-1)=Cf(x)f(x1)=C(常数)。

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

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

直接求就可以了,理论复杂度 O(Tx)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
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值