const int MAXN=2e5+5,MAXM=20,mod=1e9+7;
int ans[MAXN],a[MAXN],m;
struct query{
int lef,rig,id;
};
int s[MAXN][MAXM],temp[MAXM<<1];
void solve(int lef,int rig,vector<query> b){
int mid=lef+rig>>1;
if(lef==rig){
_for(i,0,b.size())
ans[b[i].id]=1+(a[mid]==0);
return;
}
mem(s[mid],0);
s[mid][0]++;
s[mid][a[mid]]++;
for(int i=mid-1;i>=lef;i--){
_for(j,0,m)
s[i][(a[i]+j)%m]=(s[i+1][(a[i]+j)%m]+s[i+1][j])%mod;
}
mem(s[mid+1],0);
s[mid+1][0]++;
s[mid+1][a[mid+1]]++;
for(int i=mid+2;i<=rig;i++){
_for(j,0,m)
s[i][(a[i]+j)%m]=(s[i-1][(a[i]+j)%m]+s[i-1][j])%mod;
}
vector<query>b1,b2;
_for(i,0,b.size()){
if(b[i].rig<=mid)
b1.push_back(b[i]);
else if(b[i].lef>mid)
b2.push_back(b[i]);
else{
mem(temp,0);
_for(j,0,m)_for(k,0,m)
temp[j+k]=(temp[j+k]+1LL*s[b[i].lef][j]*s[b[i].rig][k])%mod;
ans[b[i].id]=(temp[0]+temp[m])%mod;
}
}
solve(lef,mid,b1);
solve(mid+1,rig,b2);
}
int main()
{
int n=read_int();
m=read_int();
_rep(i,1,n)a[i]=read_LL()%m;
int q=read_int();
vector<query> b;
_for(i,0,q){
int l=read_int(),r=read_int();
b.push_back(query{l,r,i});
}
solve(1,n,b);
_for(i,0,q)
enter(ans[i]);
return 0;
}