• spoj 10649 镜子数的统计(正过来反过去一样)


    101为镜子数,100不是,并且121也不是,因为2反过来会变成s形,所以这题的思路只用考虑0,1,8也就是一个三进制的数就可以了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<cstdlib>
     6 #include<algorithm>
     7 using std::cout;
     8 using std::endl;
     9 using std::cin;
    10 typedef long long LL;
    11 int const N = 50;
    12 LL dp[N],f[N];
    13 char tmp[N];
    14 void pre()
    15 {
    16      f[0]=1;
    17      f[1]=3;
    18      for(int i=2;i<=45;i++)
    19          if(i&1)f[i]=f[i-1]*3;
    20          else f[i]=f[i-1];
    21      dp[1]=3;
    22      dp[2]=2;
    23      for(int i=3;i<=45;i++)
    24          if(i&1)dp[i]=dp[i-1]*3;
    25          else dp[i]=dp[i-2]*3;
    26 }
    27 bool OK(char s)
    28 {
    29      return (s=='0'||s=='1'||s=='8');
    30 }
    31 LL judge(char c,int len)
    32 {
    33      char str[50];
    34      int up=(len>>1);
    35      for(int i=0;i<up;i++)
    36      {
    37          if(!OK(tmp[i]))return 0;
    38          str[i]=str[len-i-1]=tmp[i];
    39      }
    40      if(len&1)str[up]=c;
    41      str[len]='\0';
    42      return strcmp(tmp,str)>=0;
    43 }
    44 LL getsum()
    45 {
    46    int len=strlen(tmp);
    47    LL ans=0;
    48    for(int i=1;i<len;i++)ans+=dp[i];
    49    int up=len>>1;
    50    for(int i=0;i<up;i++)
    51    {
    52        LL sum=f[len-((i+1)<<1)];
    53        if(i&&tmp[i]>'0')ans+=sum;
    54        if(tmp[i]>'1')ans+=sum;
    55        if(tmp[i]>'8')ans+=sum;
    56        if(!OK(tmp[i]))break;
    57    }
    58    if(len&1)
    59    {
    60       ans+=judge('0',len);
    61       ans+=judge('1',len);
    62       ans+=judge('8',len);
    63    }
    64    else
    65       ans+=judge(0,len);
    66    return ans;
    67 }
    68 int deal()
    69 {
    70     int len=strlen(tmp);
    71     int up=(len>>1);
    72     for(int i=0;i<up;i++)
    73     {
    74         if(!OK(tmp[i]))return 0;
    75         if(tmp[i]!=tmp[len-1-i])return 0;
    76     }
    77     if(len&1)
    78        if(!OK(tmp[up]))return 0;
    79     return 1;
    80 }
    81 int main()
    82 {
    83     int T;
    84     pre();
    85     scanf("%d",&T);
    86     while(T--)
    87     {
    88           scanf("%s",tmp);
    89           LL ans=getsum()-deal();
    90           scanf("%s",tmp);
    91           ans=getsum()-ans;
    92           cout<<ans<<endl;
    93     }
    94     return 0;
    95 }
    View Code
  • 相关阅读:
    axis2 WebService 请求参数xml格式
    钉钉扫码登录第三方,appSecret签名算法(附包名)
    win10 IE浏览器中,设置指定程序查看源文件,设置查看源默认程序
    myeclipse CI 2018.8.0和 myeclipse 10 禁止空格自动上屏,自动补全插件
    开发必备网站记录
    二叉树的前序中序后序遍历(简洁)
    贪心算法入门
    Java-二分查找与二叉树关系详解-2021-7-20
    Visual Studio Code快速创建模板(html等)
    java 面向对象1之继承
  • 原文地址:https://www.cnblogs.com/nuoyan2010/p/3094301.html
Copyright © 2020-2023  润新知