论文题: ural 1057. Amount of Degrees

http://acm.timus.ru/problem.aspx?space=1&num=1057

—————刘聪《浅谈数位类统计问题》

题意:

求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K 个互不相等的B的整数次幂之和。

首先把问题变成求 [1,X]中.....    

把X转成B进制的数,然后逐位统计下来比这个数小,并有K个1的B进制数。

以上。

 

View Code
 1 #include<cstdio>

 2 #include<cstdlib>

 3 #include<cmath>

 4 #include<climits>

 5 #include<iostream>

 6 #include<cstring>

 7 #include<algorithm>

 8 using namespace std;

 9 #define N 510

10 #define M 10010

11 #define MAXN 20

12 #define inf 2000000000

13 int num[33],C[33][33];

14 int find(int x,int k,int b){

15     int ans=0,l=0;

16     while(x){

17         num[l++]=x%b;

18         x/=b;

19     }

20     int one=0;

21     for(int i=l-1;i>=0;--i){

22         if(num[i]>1){

23             ans+=C[i+1][k-one];

24             break;

25         }

26         else if(num[i]==1){

27             if(i>=k-one) ans+=C[i][k-one];

28             if(++one>k) break;

29         }

30         if(!i&&one==k) ans++;

31     }

32     return ans;

33 }

34 int main(){

35     int x,y,k,b;

36     for(int i=0;i<=20;++i) for(int j=i;j<=31;++j){

37         if(!i||i==j) C[j][i]=1;

38         else C[j][i]=C[j-1][i]+C[j-1][i-1];

39     }

40     while(scanf("%d%d%d%d",&x,&y,&k,&b)!=EOF){

41         printf("%d\n",find(y,k,b)-find(x-1,k,b));

42     }

43     return 0;

44 }

你可能感兴趣的:(mount)