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; } }