http://codeforces.com/contest/305/problem/D
虽然给的是一颗树,其实跟树没有任何关系,仔细想一下就会发现是个数学题
还是要缕清楚思路 然后再写
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
using namespace std;
const int N=1000005;
const int MOD = 1000000007;
vector<int>vt;
int a[N];
int main()
{
//freopen("data.in","r",stdin);
a[0]=1;
for(int i=1;i<N;++i)
{
a[i]=(a[i-1]+a[i-1])%MOD;
}
int n,m,k;
while(cin>>n>>m>>k)
{
vt.clear();
bool flag=true;
while(m--)
{
int l,r;
cin>>l>>r;
if(r-l!=1&&r-l!=k+1)
{
flag=false;
}
if(r-l==k+1)
{
vt.push_back(r);
}
}
if(flag==false)
{
cout<<"0"<<endl;
continue;
}
++k;
if(vt.size()>=2)
{
if(vt[vt.size()-1]-vt[0]>=k)
{
cout<<"0"<<endl;
continue;
}
}
if(k>=n)
{
cout<<"1"<<endl;
continue;
}
int m=vt.size();
if(m==0)
{
int ans=0;
ans=a[min(n-k,k)];
for(int i=k*2+1;i<=n;++i)
{
ans=(ans+a[k-1])%MOD;
}
cout<<ans<<endl;
}else
{
int ans=0;
ans=a[min(n-k,k)-m];
for(int i=max(vt[m-1],2*k)+1;i<=n&&i-vt[0]<k;++i)
{
ans=(ans+a[k-1-m])%MOD;
}
cout<<ans<<endl;
}
}
return 0;
}