Problem:你听说过排序吗?
Description:
TT最近对排序算法很感兴趣,
现在他碰到了一个排序题,
给出包含n个数字的数组,
现在有两种操作:
1:把1到x之间的数从小到大排序,
2:把1到x之间的数从大到小排序,
初始序列满足
a[i] = a[i-1]*x+a[i-2]*y+z;(i>=3);
现给出a[1],a[2],x,y,z;
q[1] = a[1]%n+1,q[2] = a[2]%n+1;
q[i] = (yq[i-1]+xq[i-2]+z)%n+1;(i>=3)
op[i] = q[i]%2+1;(i>=1);
(op[i] 为第i个操作的类型,q[i]为第i次操作的x);
Input:
第一行:T(T<=30)T组
每组测试包含7个数字:a[1],a[2],x,y,z,n,q,(1<=a[1],a[2],x,y,z<=1e9; 1<=n<=1e5,0<=q<=1e5)数组包含n个数字,q次操作;
Output:
ans = (a[1]*1+a[2]*2,a[n]*n)%1000000007,
Sample Input:
1
2 3 1 2 3 6 3
Sample Output:
806
Note:
原始序列为:2 3 10 19 42 83
第一次操作为 2 3 ,10 3 2 19 42 83
第二次操作为 1 4 ,2 3 10 19 42 83
第三次操作为 2 3 ,10 3 2 19 42 83
Language:C++
#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int mod=1e9+7;
int a[N],q[N];
int op[N],temp[N];
int main()
{
int T;
cin>>T;
while(T--)
{
int x,y,z,n,query;
cin>>a[1]>>a[2]>>x>>y>>z>>n>>query;
for(int i=3;i<=n;i++)
a[i]=(1ll*a[i-1]*x+1ll*a[i-2]*y+z)%mod;
q[1]=a[1]%n+1;
q[2]=a[2]%n+1;
for(int i=3;i<=query;i++)
q[i]=(1ll*y*q[i-1]+1ll*x*q[i-2]+z)%n+1;
int k=0;
for(int i=query;i>0;i--)
{
if(q[i]>op[k]) op[++k]=q[i];
}
if(op[k]>=2&&a[1]>a[2]) swap(a[1],a[2]);
for(int i=op[k]+1;i<=n;i++) temp[i]=a[i];
int l=1,r=op[k];
for(int i=k;i>0;i--)
{
for(int j=op[i];j>op[i-1];j--)
{
if(op[i]%2)
{
temp[j]=a[l];
l++;
}
else
{
temp[j]=a[r];
r--;
}
}
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=1ll*temp[i]*i%mod;
if(ans>=mod) ans%=mod;
}
cout<<ans<<endl;
}
return 0;
}