k-th divisor_Codeforces

Ok,声明下2017年2月10日23:27:51 这两天因为她和朋友,一直没有做题,也可能自己太懒散
这题让我记住的关键就是:转换说明符:%lld 丢了!然后便一错再错,错一次还要修一次电脑,开心的不得了
嗯,这款华硕笔记本,一直出网络故障(以至于打开网页一度失败),并且自己状态不佳,像个无头苍蝇 所以不得不苦笑承认,自己真是个Loser。

Ok,说下解题步骤 : 特别声明下:一个整数的因子个数有两种情况: 1). 比如 36 ,它有6 ,因子数:1 2 3 4 6 . 然后
4->9 3->12 2->18 1->36 ,而 6 是单独的,No : 2*t-1 2). 比如 12 , 因子数 : 1 2 3
. 然后 3->4 2->6 1-> 12 , No: 2*t 先行判断:如果是 前一半因子 ,直接 输出 结束 否则,就输出
前一半因子的相对一半(利用num数组保存,下标值应为:总和减去 K)

代码如下:

#include <stdio.h>
#define maxn 10000000
long long num[maxn]; 
int main(){
    long long n,k,i,t;
    scanf("%lld %lld",&n,&k);
    bool flag=0;
    for(t=0,i=1;i*i<=n;i++){
        if(n%i==0){
            if(i*i!=n)
                num[t]=n/i;
            else
                flag=1;
            t++;
            if(t==k){
                printf("%lld\n",i);
                return 0;
            }
        }
    }
    if(!flag&&k<=2*t)
        printf("%lld\n",num[2*t-k]);   
    else if(flag&&k<=2*t-1)
        printf("%lld\n",num[2*t-1-k]);  
    else
        printf("-1\n");         
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值