zoukankan      html  css  js  c++  java
  • HDU 4662 MU Puzzle 数论或者水题

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=4662

    题目是问目标串能否由MI得到,我们可以逆向思维,目标串能否反过来处理得到MI,所以,首先排除M没有出现或者出现超过一次,或者只出现了一次但没有出现在第一个位置的情形····也就是说只剩下第一个位置是M,然后不再出现M的情形····

    接下来思考如何得到I,既然要得到I,U必然要化成I,一个U相当于3个I,接下来还可以每次添加UU,相当于添加了6个I,这样当I的个数能凑成2^k,k>=0时,就是解

    问题转化为如下:

    关于x + 6*y = 2^k中x的整数解

    问题描述:

    当x取何值时,一定能找到一对y,k,其中y>=0,k>=0,y,k都是整数,来满足 x + 6*y = 2^k。

    答案:

    x= 1,或者x%6 =2 或者x%6 =4.

    证明:

    显然当x = 1时,y=0,z=0时满足条件,x=1是解。

    现在只考虑x>1的情形。

    当x>1时,如果x为解。

    那么x = 2^k-6*y。k>0····

    注意到8%6 = 2

    那么k个2(k>0)相乘后的积%6 一定为2或4。

    那么x%6 = (2^k-6*y)%6 = 2^k %6 = 2或4。

    这就证明了如果x是解,要么x =1,否则x%6=2或4.

    那么是不是凡是%6=2或4的就一定是解呢···答案是肯定的。

    先考虑2+6*q的情形

    2+6*q+6*y = 2^k

    3(q+y)+1 = 2^p , p =k-1

    注意要4%3=1,由此得到2^(2t)%3 = 1,2^(2t+1)%3 = 2.

    上面的式子必然成立。

    4+6*q的情形同样可以证明。

    事实上,可以从另外一个角度思考,1必然是解,当x>=1时,如果(2^k-x)%6=2^k%6 - x%6 = 0,,注意到2^k%6=2或4,所以除非x%6=2或者4,否则等式不会成立

    贴代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #define N 1000007
     4 char a[N];
     5 int main()
     6 {
     7 //    freopen("in.c","r",stdin);
     8     int n;
     9     scanf("%d",&n);
    10     for(int i=0; i<n; ++i)
    11     {
    12         scanf("%s",a);
    13 //        printf("%s
    ",a);
    14         int len=strlen(a);
    15         int cnt =0;
    16         if(a[0] !='M')
    17         {
    18             printf("No
    ");
    19             continue;
    20         }
    21         bool flag = true;
    22         for(int j=1; j<len; ++j)
    23         {
    24             if(a[j] == 'M')
    25             {
    26                 flag = false;
    27                 break;
    28             }
    29             if(a[j] == 'U')
    30                 cnt += 3;
    31             else
    32                 ++cnt;
    33         }
    34         if(!flag)
    35         {
    36             printf("No
    ");
    37             continue;
    38         }
    39         if(cnt == 1)
    40         {
    41             printf("Yes
    ");
    42             continue;
    43         }
    44 //        printf("cnt=%d
    ",cnt);
    45         if(cnt%6 == 2 || cnt%6 == 4)
    46             flag =true;
    47         else flag =false;
    48         if(flag)
    49             printf("Yes
    ");
    50         else
    51             printf("No
    ");
    52     }
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    最小树形图 朱刘算法模板+建边技巧
    模板倍增LCA 求树上两点距离 hdu2586
    【瞎搞题】gym226123 L. For the Honest Election
    【凸包板题】Gym
    集合3
    集合2
    集合1
    常用API&异常
    内部类&API
    多态&接口类&接口
  • 原文地址:https://www.cnblogs.com/allh123/p/3250406.html
Copyright © 2011-2022 走看看