首页 > 代码库 > hdu 5063 小想法

hdu 5063 小想法


题意给出最多不超过50次询问   顾对每次询问倒着去找起始位置 中间标记平方了多少次    然后用找到的数去平方就行


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int main()
{
    int T,n,m,i,j;
    int num[100010],power;
    char str[5];
    __int64 a;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        memset(num,0,sizeof(num));
        for(i=1;i<=m;i++)
        {
            scanf("%s%I64d",str,&a);
            if(str[0]==‘O‘)
            {
                if(a==1) num[i]=1;
                else if(a==2) num[i]=2;
                else num[i]=3;
            }
            else
            {   
                power=0;
                for(j=i-1;j>=1;j--)
                {
                    if(num[j]==1)
                    {
                        if(n%2)
                        {
                            if(a<=(n+1)/2) a=a*2-1;
                            else a=2*a-n-1;
                        }
                        else
                        {
                            if(a<=n/2)a=a*2-1;
                            else a=2*a-n;
                        }
                    }
                    else if(num[j]==2)
                    {
                        a=n+1-a;
                    }
                    else if(num[j]==3) power++;
                }
                for(int k=1;k<=power;k++)
                {
                    a*=a;
                    a%=1000000007;
                }
                printf("%I64d\n",a);
            }
        }
    }
    return 0;
}

hdu 5063 小想法