论文题: 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 }