題目:題目鏈接
題解:
找規律
當n = 16 時
k=1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
k=2 1 3 5 7 9 11 13 15
k=4 1 5 9 13
k=8 1 9
k=16 1
只要找到k的約數就可以防止不重複
求sum發現是滿足等差數列
#include<bits/stdc++.h>
using namespace std;
const int inf= 0x3f3f3f3f;
typedef long long ll;
set<ll>ans;
set<ll>cn;
int main()
{
ll n;
cin>>n;
for(ll i=1;i*i<=n;i++)
{
if(n%i==0)
{
cn.insert(i);
cn.insert(n/i);
}
}
set<ll>::iterator it = cn.begin();
while(it!=cn.end()) //首項爲1 公差爲cn 最大項小於n的前n項和
{
ll k = n/(*it); //有k項
ans.insert(k+(*it)*k*(k-1)/2);
it++;
}
it = ans.begin();
printf("%d",*it);
it++;
while(it!=ans.end())
{
printf(" %lld",*it);
it++;
}
}