hdu 5063 Operation the Sequence

Operation the Sequence

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 489    Accepted Submission(s): 191


Problem Description
You have an array consisting of n integers:  a1=1,a2=2,a3=3,,an=n . Then give you m operators, you should process all the operators in order. Each operator is one of four types:
Type1: O 1 call fun1();
Type2: O 2 call fun2();
Type3: O 3 call fun3();
Type4: Q i query current value of a[i],  this operator will have at most 50.
Global Variables: a[1…n],b[1…n];
fun1() {
index=1;
  for(i=1; i<=n; i +=2) 
    b[index++]=a[i];
  for(i=2; i<=n; i +=2)
    b[index++]=a[i];
  for(i=1; i<=n; ++i)
    a[i]=b[i];
}
fun2() {
  L = 1;R = n;
  while(L<R) {
    Swap(a[L], a[R]); 
    ++L;--R;
  }
}
fun3() {
  for(i=1; i<=n; ++i) 
    a[i]=a[i]*a[i];
}
 

Input
The first line in the input file is an integer  T(1T20) , indicating the number of test cases.
The first line of each test case contains two integer  n(0<n100000) m(0<m100000) .
Then m lines follow, each line represent an operator above.
 

Output
For each test case, output the query values, the values may be so large, you just output the values mod 1000000007(1e9+7).
 

Sample Input
  
  
1 3 5 O 1 O 2 Q 1 O 3 Q 1
 

Sample Output
  
  
2 4
 

Source
 

Recommend
heyang   |   We have carefully selected several similar problems for you:   5065  5064  5062  5061  5060 
 

反着来,复杂度50*n

自己那个时候写挫了,fst了。。

mod在指数地方取模是要取mod-1的。。

/***********************************************\
 |Author: YMC
 |Created Time: 2014/10/11 19:22:51
 |File Name: b.cpp
 |Description: 
\***********************************************/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#define L(rt) (rt<<1)
#define R(rt) (rt<<1|1)
#define mset(l,n) memset(l,n,sizeof(l))
#define rep(i,n) for(int i=0;i<n;++i)
#define maxx(a) memset(a, 0x3f, sizeof(a))
#define zero(a) memset(a, 0, sizeof(a))
#define srep(i,n) for(int i = 1;i <= n;i ++)
#define mp make_pair
const int inf=0x3f3f3f3f ;
const double eps=1e-8 ;
const double pi=acos (-1.0);
typedef long long ll;
using namespace std;
pair <char,int> pa[100005];
int pos[100];
int tot;
int T,n,m,b;
char a[10];
ll mod_pow(ll x,ll n,ll mod){
    ll res = 1;
    while(n > 0){
        if(n & 1) res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}
void solve(int u) {
    int p = pa[u].second;
    int pp = 0;
    for(int i = u-1; i >= 0 ;--i) {
        char tt = pa[i].first;
        if(tt == 'Q') continue;
        int t = pa[i].second;
        if(t == 3) {
            pp ++;continue;
        } 
        if(t == 2) {
            p = n - p + 1;
            continue;
        }
        if(t == 1) {
            int tp = (n + 1)/2;
            if(p <= tp) p = p * 2 - 1;
            else {
                p -= tp;
                p *= 2;
                //p = p * 2 - n - n % 2;
            }
        }
    }
    //ll ans = mod_pow(p , mod_pow(2,pp,1000000007ll) , 1000000007ll); //wrong
    ll ans = mod_pow(p , mod_pow(2,pp,1000000007ll-1) , 1000000007ll);  //right
    cout<<ans<<endl;
}
int main() {
    //freopen("input.txt","r",stdin); 
    scanf("%d",&T);
    while(T--) {
        tot = 0;
        scanf("%d %d",&n,&m);
        rep(i,m) {
            scanf("%s %d",&a,&b);
            pa[i] = mp(a[0],b);
            if(a[0] == 'Q')  pos[tot ++] = i;
        }
        for(int i = 0;i<tot;++i) {
            solve(pos[i]);
        }
    }
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值