1161: 序列

Memory Limit:262 MB Time Limit:2.000 S
Judge Style:Text Compare Creator:
Submit:1 Solved:0

Description

给定一个数字串 S,每次询问这个序列的一个连续子序列的本质不同回文子序列个数。

本质不同的含义是:两个序列不同当且仅当它们的长度不同或存在对应位置不同。

答案可能很大,因此只要输出对1000000007算术取模的值。

Input

第一行包含一个数据组数T。每组数据的格式如下:

第一行包含两个正整数n,m,k,表示序列的长度为n,询问的次数为m,且序列中元素都在[1,k]之间。

接下来一行n个正整数,第i个数表示序列 S的第 i个元素 ci

接下来m行,每行两个正整数[li,ri],表示这次询问的子序列为S「LI,RI」


Output

输出m行,每行一个整数,表示这次询问的结果对1000000007算术取模的值。

Sample Input Copy

1
5 2 2
1 1 2 2 1
1 5
2 4

Sample Output Copy

7
3

HINT

给出样例一的解释:

第一组询问满足条件的子序列有 {1}, {1,1}, {1,1,1}, {1,2,1}, {1,2,2,1}, {2}, {2,2},共有7种。

第二组询问满足条件的子序列有 {1}, {2}, {2,2},共有3种。

数据很弱,请根据题目想出正确方法。 题目保证数据随机生成。另外,区间[li,ri]存在li>ri情况,此时请输出0,同一问题可能询问多次。

数据保证对于10%的数据,N<=10,且存在M=0。对于剩下的90%的数据,存在第一组数据使得n=14.对于20%的数据,存在一组数据使得m=0.

对于100%的数据,n<=50,m<=1000000,k<=1000,t<=10。(其中n,m为本测试点中n,m之和)


program data;
uses math;
var
f:char;
a:array[1..1000000]of longint;
i,t,n,m,k,p,sumn,summ:longint;
begin
    for f:='1' to '9'  do
    begin
    randomize;
    t:=random(3)+ord(f)-ord('0');
    if t>10 then t:=10;
    sumn:=50; summ:=1000000;
    writeln(t);
    for t:=1 to t do
    begin
      n:=(random(sumn)+3) div 3;
      sumn:=sumn-n;
      m:=min((random(summ)+3) div 3,sqr(n-3));
      summ:=summ-m;
      k:=(ord(f)-ord('0'))*100+random(100);
      writeln(n,' ',m,' ',k);
      for i:=1 to n div 2 do
      begin
        a[i]:=(random(k div 10)+i*random(n)+1)mod k;
        if a[i]=0 then a[i]:=random(k-a[i])+1;
        write(a[i],' ');
      end;
      for i:=n div 2+1 to n do
      begin
        p:=random(2);
        if p=1 then write(a[n-i+1],' ')
               else write((a[random(i-2)+1]+random(i))mod k,' ');
      end;
      writeln;
      for i:=1 to m do
      begin
        p:=random(2);
        a[i]:=(random(i)*i)mod n;
        if a[i]=0 then a[i]:=2+random(n div 2);
        if p=1 then writeln(a[i],' ',a[i]+random(n-a[i]))
               else writeln(a[i],' ',n);
      end;
    end;
    end;
  end.//以上是数据生成代码,自行参考。