daimayuan每日一题#867 分数拆分

题目链接:

分数拆分 - 题目 - 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值