hdu 4662 MU Puzzle 13多校第六场

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4662

题解: 首先U全部转化为三个I(本质),M又只能在开头。所以就是在乎I的个数问题了。  如果仅仅有扩倍,则I的个数为2^n个,如果中间某次去了K个两个U ,I的个数就为2^n-6*k, 再下次无论是扩倍还是减6,都还是可以表示为2^n-6*k.  所以必要条件找到了,那就是num(I)=2^n-6*k 有整数解,再看充分性,一旦可以表示为这种形式,我们就扩倍n次,然后做k次去两个U的操作,充分性得证。  

考虑这个不定方程。 首先2^k mod6 是周期数列1,2,4,2,4....

所以必要条件是I==1 || I>1&&I%6==2||I>1&&I%6==4    ,反之,只要满足这个条件,我们取充分大的n,使得I===2^n mod6, 然后2^n-I=6*一个正整数,ok啦

然后注意细节就是中间不可以出现M。 

#include <iostream>

using namespace std;

int main()
{

  int T;
  cin>>T;
   string s;
   while(cin>>s)
 {

  int count=0;
  int length=s.length();

  int bad=0;

  if(s[0]!='M')
  {
    bad++;
    goto judge;
  }
  for(int i=0;i<length;i++)
   if(s[i]=='U')  count+=3;
   else if(s[i]=='I')  count++;
   else if(s[i]=='M'&&i>0)
   {
      bad++;
      goto judge;

   }

   if(count==1||count>1&&count%6==2||count>1&&count%6==4)
   ;
   else bad++;


   judge:
   if(bad!=0)
     cout<<"No"<<endl;
   else
     cout<<"Yes"<<endl;
 }

}


原文地址:https://www.cnblogs.com/814jingqi/p/3247185.html