题目链接:
分数拆分 - 题目 - Daimayuan Online Judgehttp://oj.daimayuan.top/course/11/problem/867思路:
也就是说,要找到(k*x)%(x-k)==0的正整数x(x>=2k)
当x==2k时 变成(2*k*k)/(k).
当x>2k时 可以变成 (2*k*k+b*k)/(k+b)其中b是从1开始的正整数。这时候我们就发现了关键
这个式子等价于(2*k*k)%(k+b)==0&&(b*k)%(k+b)==0
对于第一个条件(2*k*k)%(k+b)当且仅当(k+b)是(2*k*k)的因子,namo就答案就呼之欲出了。
枚举(2*k*k)的因子,假设找到的因子是t,namo,b=t-k,判断是否满足第二个条件(b*k)%(k+b)==0 即可。
时间复杂度是O(k)
//#define pei_pei_
//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
#include<functional>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<algorithm>
#include<set>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define FI first
#define SE second
#define _for(type,i,a,b) for(type i=(a);i<(b);++i)
#define _efor(type,i,a,b) for(type i=(a);i<=(b);++i)
#define _rfor(type,i,a,b) for(type i=(a);i>(b);--i)
#define _refor(type,i,a,b) for(type i=(a);i>=(b);--i)
#define _sfor(p,st) for(auto &p:st)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<double,int> pdi;
const double pi=acos(-1.0);
const double eps=1e-8;
const int mod=100003;
const int _mod=998244353;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int maxn=200010;
ull base=1331;
//-------------------------------------------------------------------
//-------------------------------------------------------------------
signed main(){
//ifstream cin("D:\\in.txt");
//ofstream cout("D:\\out.txt");
IOS;
#ifdef pei_pei_
double be=clock();
#endif // err
//==================================================================
ll k;
cin>>k;
ll t=2*k*k;
ll cnt=0;
for(ll i=1;i*i<=t;i++){
if(t%i==0){
if(i>=k&&((i-k)*k)%i==0)
cnt++;
if(t/i>=k&&((t/i-k)*k)%(t/i)==0)
cnt++;
}
}
cout<<cnt<<'\n';
//==================================================================
#ifdef pei_pei_
double en=clock();
cout<<endl<<"time: "<<fixed<<setprecision(8)<<en-be<<" ms";
#endif // err
return 0;
}