• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
slon
nit-acm
博客园    首页    新随笔    联系   管理    订阅  订阅

论文题: 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 }
posted @ 2012-01-17 15:34  slon  阅读(478)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3