【JZOJ5773】簡單數學題【數論,數學】
阿新 • • 發佈:2018-12-11
題目大意:
思路:
40分做法:
直接暴力列舉,輸出符合要求的即可。
100分做法:
首先,我們要求的是 設,那麼就有 我們知道,,所以 用乘法分配律脫括號 拆成兩半 左邊可以簡化 一開始設了,右邊有一項就是,所以我們可以把它簡化成 右邊約分得 我們知道,這個式子的值必須是個整數。我們設答案為整數 等號兩邊同時乘2得 那麼由於和1都是整數,所以就有也是整數 當為整數時,就一定是的因數,所以就一定是的因數! 那麼我們就列舉的因數,當為正整數(即是奇數)時,就是一個合法的解!
程式碼:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#define N 2000100
#define ll long long
using namespace std;
ll n,a[N],d[N],sum,ans;
int main()
{
cin>>n;
for (ll i=1;i<=sqrt(n);i++) //求出n的所有因數
if ((n%i)==0)
{
if (i*i==n) d[++sum]=i;
else
{
d[++sum]=i;
d[++sum]=n/i;
}
}
for (ll i=1;i<=sum;i++)
{
if (((n/d[i])%2)&&n-d[i]) //符合要求
a[++ans]=n-d[i];
}
sort(a+1,a+1+ans);
cout<<ans;
for (int i=1;i<=ans;i++)
cout<<' '<<a[i];
return 0;
}