[5773]简单数学题 {数学}

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82814131

题目

Description

话说, 小X是个数学大佬,他喜欢做数学题。有一天,小X想考一考小Y。他问了小Y一道数学题。题目如下: 对于一个正整数N,存在一个正整数T(0<T<N),使得 N 1 2 T N T \frac{N-\frac{1}{2}T}{N-T} 的值是正整数。
小X给出N,让小Y给出所有可能的T。如果小Y不回答这个神奇的大佬的简单数学题,他学神的形象就会支离破碎。所以小Y求你帮他回答小X的问题。

Input

一个整数N。

Output

第一个数M,表示对于正整数N,存在M个不同的正整数T,使得 N 1 2 T N T \frac{N-\frac{1}{2}T}{N-T} 是整数。
后面是M个数,每一个数代表可能的正整数T(按从小到大的顺序排列)。


解题思路

N 1 2 T N T \frac{N-\frac{1}{2}T}{N-T}
我们可以假设 x = N T x=N-T
可知 T = N x = N ( N T ) T=N-x=N-(N-T)
代入原式得 N 1 2 [ N ( N T ) ] x \frac{N-\frac{1}{2}\left [ N-(N-T)\right ]}{x}
用乘法分配律可得 N 1 2 N x + 1 2 [ N T ] x \frac{N- \frac{1}{2}N}{x}+ \frac{\frac{1}{2}\left[N-T \right] }{x}
假设式子的和为正整数 k k 约分可得 N x + 1 = 2 k \frac{N}{x}+1=2k
然后我们显而易见的发现 x x N N 的约数集合,我们仅需判断 N x + 1 \frac{N}{x}+1是否为偶数即可。将对应的 N-x 储存在 ans$数组里,排一个序。


代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
using namespace std; 
long long n,ans,t,a[10001],b[10001];   
int main()
{
	scanf("%lld",&n); 
    for (int i=1;i<=sqrt(n);i++)
     if (n%i==0) {
     	if (i*i==n) b[++t]=i; else {b[++t]=i; b[++t]=n/i;}
	 }
	for (int i=1;i<=t;i++)
	 if (b[i]!=n&&((n/b[i]+1)%2==0)) a[++ans]=n-b[i]; 
	sort(a+1,a+ans+1); 
	printf("%lld",ans); if (ans>0)
	{
	 for (int i=1;i<ans;i++) printf(" %lld",a[i]); 
	  printf(" %lld",a[ans]); 
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/82814131