Amount of Degrees

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));
}

猜你喜欢

转载自www.cnblogs.com/fangbozhen/p/11844261.html