首页 > 其他 > 详细

Amount of Degrees

时间:2019-11-12 19:06:05      阅读:112      评论:0      收藏:0      [点我收藏+]

https://loj.ac/problem/10163

题目描述

??求一段区间\([x,y]\)内满足恰好等于\(K\)个不相等的\(B\)的整次幂的和的数的个数。

思路

??题目求的其实就是在区间\([x,y]\)内满足在\(B\)进制下有且仅有\(K\)\(1\),其余位位\(0\)的数的个数。我们显然可以先转化为区间减法,接下来考虑如何求\([1,x]\)内符合条件的数的个数。我们可以按位思考,如果这一位大于\(1\),显然对于这之后的位数可以任意选,我们直接统计剩余的位数中选出\(k\)\(1\)的方案数即可,如果这一位等于\(1\),我们可以考虑先加上这一位为\(0\)时的方案数,再令这一位为\(1\)统计答案即可。

代码

#include<bits/stdc++.h>
using namespace std;

int f[40][40];
void pre()
{
    f[0][0]=1;
    for(int i=1;i<=31;i++)
    {
        f[i][0]=f[i-1][0];
        for(int j=1;j<=i;j++)
            f[i][j]=f[i-1][j]+f[i-1][j-1];
    }
}
int p[50],b;
int cal(int x,int k)
{
    int cnt=0;
    while(x)p[++cnt]=x%b,x/=b;
    int ans=0;
    for(int i=cnt;i>=1;i--)
    {
        if(p[i]>1){ans+=f[i][k];break ;}
        else if(p[i]==1)ans+=f[i-1][k],k--;
        if(k<0)break ;
    }
    return ans;
}

int main()
{
    int x,y,k;
    pre();
    scanf("%d%d%d%d",&x,&y,&k,&b);
    printf("%d",cal(y+1,k)-cal(x,k));
}

Amount of Degrees

原文:https://www.cnblogs.com/fangbozhen/p/11844261.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!