我是先将指数和值分离开来,因为指数取模的是模数的欧拉函数,值取模的是模数,计算时再分别计算。不知有没有问题?
核心代码如下(线段树的updata)
void updata(int x,int l,int r,int L,int R)
{
if(book[x]>times)
return ;
if(l==r)
{
if(more[l])
{
tree[x]=ksm(c,a[l]+euler,p);
a[l]=ksm(c,a[l]+euler,euler);
}
else
{
tree[x]=ksm(c,a[l],p);
if(pow(c,a[l])>=euler)
{
a[l]=ksm(c,a[l],euler);
more[l]=1;
}
else
a[l]=pow(c,a[l]);
}
book[x]++;
}
else
{
if(L<=l&&r<=R)
book[x]++;
int mid=(l+r)>>1;
if(L<=mid)
updata(x<<1,l,mid,L,R);
if(mid+1<=R)
updata(x<<1|1,mid+1,r,L,R);
pushup(x);
}
}
其中a是指数,tree是值
目前能够拿到65分