1. 程式人生 > >[5773]簡單數學題 {數學}

[5773]簡單數學題 {數學}

題目

Description

話說, 小X是個數學大佬,他喜歡做數學題。有一天,小X想考一考小Y。他問了小Y一道數學題。題目如下: 對於一個正整數N,存在一個正整數T(0<T<N),使得N12TNT\frac{N-\frac{1}{2}T}{N-T}的值是正整數。 小X給出N,讓小Y給出所有可能的T。如果小Y不回答這個神奇的大佬的簡單數學題,他學神的形象就會支離破碎。所以小Y求你幫他回答小X的問題。

Input

一個整數N。

Output

第一個數M,表示對於正整數N,存在M個不同的正整數T,使得N12TNT\frac{N-\frac{1}{2}T}{N-T}

是整數。 後面是M個數,每一個數代表可能的正整數T(按從小到大的順序排列)。

解題思路

N12TNT\frac{N-\frac{1}{2}T}{N-T} 我們可以假設x=NTx=N-T 可知T=Nx=N(NT)T=N-x=N-(N-T) 代入原式得N12[N(NT)]x\frac{N-\frac{1}{2}\left [ N-(N-T)\right ]}{x} 用乘法分配律可得N12Nx+12[NT]x\frac{N- \frac{1}{2}N}{x}+ \frac{\frac{1}{2}\left[N-T \right] }{x}

假設式子的和為正整數kk約分可得Nx+1=2k\frac{N}{x}+1=2k 然後我們顯而易見的發現xxNN的約數集合,我們僅需判斷Nx+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]); } }