标签:des style blog color io os ar java for
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 154 Accepted Submission(s): 74
题目有3中操作。
然后问,经过操作后某个位置的数是多少。
可以发现 ,操作3可以最后处理 。
可以通过最后的位置找到原式的位置, 并且原式位置的值a[i]就等于i。
就是一个逆向的过程 , 然后询问只有50组 , 就暴力就可以了 。
处理操作3的时候 , 快速幂一下 。
然后因为 mod = 1e9+7 是一个素数 ,
所以计算 ( A^k ) % (mod ) 的时候 k要模一下 ( mod -1 ) , 不然会超时, 这里卡了一下 。
如果 mod 不是素数的话就求一下 欧拉函数 就行了。
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <map> #include <cmath> using namespace std; typedef long long LL; const int mod = 1e9+7; const int N = 100010; struct node { LL num ,cnt; int id ; bool is_Q; } e[N] ,Q[N] ; LL quick_mod( LL a , LL b ) { LL res = 1 ; while( b ) { if( b&1 ) res = res * a % mod ; a = a * a % mod ; b >>= 1; } return res ; } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int _ ,n , m ; char s[5]; LL x ; scanf("%d",&_); while( _-- ){ scanf( "%d%d",&n,&m ); for( int i = 0 ; i < m ; ++i ){ scanf("%s%I64d",s,&x); if( s[0] == ‘Q‘ ) e[i].is_Q = 1; else e[i].is_Q = 0 ; e[i].num = x , e[i].id = i , e[i].cnt = 1 ; } while( m > 0 && !e[m-1].is_Q ) m--; int tail = 0 ; for( int i = m -1 ; i >= 0 ; --i ){ if( e[i].is_Q ){ Q[tail++] = e[i] ; continue ; } for( int j = 0; j < tail ; ++j ){ if( e[i].num == 1 ){ int mid = ( n + 1 ) / 2 ; if( Q[j].num <= mid ) Q[j].num = 2 * Q[j].num - 1 ; else Q[j].num = 2 * ( Q[j].num - mid ); } else if( e[i].num == 2 ){ Q[j].num = n - Q[j].num + 1 ; } else { Q[j].cnt = Q[j].cnt * 2 % (mod - 1) ; } } } for( int j = tail - 1 ; j >=0 ; --j ){ printf("%I64d\n",quick_mod( Q[j].num , Q[j].cnt)); } } }
HDU 5063 Operation the Sequence
标签:des style blog color io os ar java for
原文地址:http://www.cnblogs.com/hlmark/p/4020077.html