【数论】SSL_1157 简单数学题

本文深入探讨了如何通过枚举和数学转换解决特定类型的数学问题,即给定正整数N,求所有符合条件的正整数T(0<T<N),并详细解释了算法思路和实现代码。

题意

给出NNN,求出每一个正整数T(0&lt;T&lt;N)正整数T(0&lt;T&lt;N)T(0<T<N)

N−12TN−T\frac{N - \frac{1}{2}T}{N-T}NTN21T

思路

xxxN−TN-TNT

T=N−xT=N-xT=Nx
然后我们可以转一下公式:
N−12TN−T\frac{N - \frac{1}{2}T}{N-T}NTN21T
=N−12(N−x)x=\frac{N - \frac{1}{2}(N-x)}{x}=xN21(Nx)
=12Nx+12xx=\frac{\frac{1}{2}N}{x}+ \frac{\frac{1}{2}x}{x}=x21N+x21x
=N2x+12=\frac{N}{2x}+\frac{1}{2}=2xN+21
kkk为一个正整数,根据题意可得
N2x+12=k\frac{N}{2x}+\frac{1}{2}=k2xN+21=k

Nx+1=2k\frac{N}{x}+1=2kxN+1=2k
因为kkk是正整数,所以2k2k2k为偶数,所以
Nx为奇数\frac{N}{x}为奇数xN
综上所述,我们枚举一下NNN的约数xxx,根据上面的性质统计答案。

代码

#include<cstdio>
#include<algorithm>
using namespace std;

long long N, cnt;
long long a[4001];
int main() {
	scanf("%lld", &N);
	for (long long i = 1; i * i < N; i++) {
		long long x = i;
		if (N % x) continue;
		if ((N / x) % 2) a[++cnt] = N - x;
		if (i == 1) continue;
		x = N / i;
		if ((N / x) % 2) a[++cnt] = N - x;
	}
	sort(a + 1, a + cnt + 1);
	printf("%d", cnt);
	for (int i = 1; i <= cnt; i++)
		printf(" %lld", a[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值