HDU 4350 Card 模拟题

题意:给你一副扑克牌,现在抽出L到R的牌,放到开头,重复N次,输出洗完牌之后的扑克牌的顺序。

有一个特点:R之后的牌永远不会do

要点:找到循环节,即重复tim次后R‘回到原点R

O O O O O O O O O O O O O 如果是9~11

O O O O O O O O O O O O O num=1

O O O O O O O O O O O O O num=2

O O O O O O O O O O O O O num=3

设选中的区间有len张牌,num为走了多少行,从开始到结束R’走了num*R个‘O’,而区间行走的长度为len*tim。找到周期,一切好办。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[53];
int N,L,R;
long long tim;
void fuck()
{int len=R-L+1;if(L==1) return; if(len==0) return;for(int i=1;i<=N;i++){if((i*R)%len==0){tim=(i*R)/len;break;} }tim=N%tim;return;
}
int Input()
{for(int i=1;i<=52;i++){cin>>a[i];}cin>>N>>L>>R;if(L>R){return 0;}return 1;
}
void treatment(int ca)
{fuck();if(tim==0||L==1) {cout<<"Case #"<<ca<<":";for(int i=1;i<=52;i++)cout<<" "<<a[i];cout<<endl;return;}for(long long k=1;k<=tim;k++){int fu[53];int len=R-L+1;int num=0;memset(fu,0,sizeof(fu));for(int i=L;i<=R;i++){fu[++num]=a[i];}for(int i=L-1;i>=1;i--){a[i+len]=a[i];}for(int i=1;i<=len;i++){a[i]=fu[i];}}cout<<"Case #"<<ca<<":";for(int i=1;i<=52;i++)cout<<" "<<a[i];cout<<endl;
}
int main()
{int t,ca=1;cin>>t;while(t--){int kk=Input();if(kk==0) {cout<<"Case #"<<ca++<<":";for(int i=1;i<=52;i++)cout<<" "<<a[i];cout<<endl;continue;} treatment(ca++);}return 0;
}