1. 程式人生 > >2018年9月22日提高組模擬賽 T3 簡單數學題

2018年9月22日提高組模擬賽 T3 簡單數學題

大意

對於一個正整數NN,存在一個正整數TT0<T<N0<T<N),使得NT/2NT\frac{N-T/2}{N-T}的值是正整數

思路

NT/2NT,x=NT\frac{N-T/2}{N-T},設x=N-T NT/2x=N(N(NT))/2x=NN/2+x/2x有\frac{N-T/2}{x}=\frac{N-(N-(N-T))/2}{x}=\frac{N-N/2+x/2}{x}

接下來分開

NN/2x+
x/2x\frac{N-N/2}{x}+\frac{x/2}{x}

NN/2x+12=k\frac{N-N/2}{x}+\frac{1}{2}=k

兩邊同時乘2

2NNx+1=2k\frac{2N-N}{x}+1=2k

Nx+1=2k\frac{N}{x}+1=2k

因為2k2k11都是整數,所以Nx\frac{N}{x}也是整數 所以xxNN的約數,即NTN-TNN的約數

又因為Nx\frac{N}{x}是奇數,所以我們一開始讓NN不斷除以2變成奇數為止,這樣就避免了約數不是奇數的情況,然後列舉因子,排序,去重,輸出即可

程式碼

#include<cstdio>
#include<cmath>
#include<set>
using namespace std;long long n,sqr,t2=1;
set<long long>se;
signed main()
{
	scanf("%lld",&n);
	sqr=sqrt(n);//計算平方根
	while(!(n&1))n>>=1,t2<<=1;//去掉偶因子
	if(n==1) return printf("0")&0;
	se.insert(n);
	for(register
int i=3;i<sqr;i++) if(!(n%i))se.insert(i),se.insert(n/i);//放入 printf("%d",se.size()); for(set<long long>::iterator i=se.begin();i!=se.end();i++) printf(" %lld",n*t2/(*i)*(*i-1));//輸出 }