• 【BZOJ】【1662】/【POJ】【3252】 【USACO 2006 Nov】Round Number


    数位DP


    同上一题Windy数

    预处理求个组合数

    然后同样的方法,这次是记录一下0和1的个数然后搞搞

    Orz cxlove

     1 /**************************************************************
     2     Problem: 1662
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:0 ms
     7     Memory:1280 kb
     8 ****************************************************************/
     9  
    10 //POJ 3252 && BZOJ 1662
    11 #include<cmath>
    12 #include<vector>
    13 #include<cstdio>
    14 #include<cstring>
    15 #include<cstdlib>
    16 #include<iostream>
    17 #include<algorithm>
    18 #define rep(i,n) for(int i=0;i<n;++i)
    19 #define F(i,j,n) for(int i=j;i<=n;++i)
    20 #define D(i,j,n) for(int i=j;i>=n;--i)
    21 #define pb push_back
    22 using namespace std;
    23 int getint(){
    24     int v=0,sign=1; char ch=getchar();
    25     while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();}
    26     while(isdigit(ch))  {v=v*10+ch-'0'; ch=getchar();}
    27     return v*sign;
    28 }
    29 const int N=1e7+10,INF=~0u>>2;
    30 const double eps=1e-8;
    31 /*******************template********************/
    32 int c[40][40];
    33 void init(){
    34     c[0][0]=1;
    35     F(i,1,32){
    36         c[i][0]=c[i-1][0];
    37         F(j,1,i) c[i][j]=c[i-1][j]+c[i-1][j-1];
    38     }
    39 }      
    40 int solve(int n){
    41     int len=0,bit[40],cnt=0;
    42     for(;n;n>>=1) bit[++len]=n&1;
    43     int ans=0;
    44     F(i,1,len-1)
    45         D(j,i-1,(i+1)>>1)
    46             ans+=c[i-1][j];
    47     int one=1,zero=0;
    48     D(i,len-1,1)
    49         if (bit[i]){
    50             zero++;
    51             F(j,max(0,(len+1)/2-zero),i-1)
    52                 ans+=c[i-1][j];
    53             zero--;
    54             one++;
    55         }
    56         else zero++;
    57 //  ans+=c[cnt-1][(len+1)>>1];
    58     return ans;
    59 }  
    60 int main(){
    61     init();
    62     int l=getint(),r=getint();
    63     printf("%d
    ",solve(r+1)-solve(l));
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    JavaScript实现html购物车代码
    SQLServer2019安装教程
    SQLServer2019安装教程
    pragma指令简介
    16进制字符串转数字(C/C++,VB/VB.net,C#)
    对方网络非正常断开检测方法
    stl map高效遍历删除的方法
    memmove 和 memcpy的区别
    Socket 心跳包机制总结
    如何将内存中的位图数据绘制在DC上
  • 原文地址:https://www.cnblogs.com/Tunix/p/4307416.html
Copyright © 2020-2023  润新知