우 객 다 교 2 차 A run
시간 제한: C / C + + 1 초, 기타 언어 2 초 공간 제한: C / C + + 131072 K, 기타 언어 262144 K 64bit IO 포맷:% lld
제목 설명
White Cloud is exercising in the playground. White Cloud can walk 1 meters or run k meters per second. Since White Cloud is tired,it can't run for two or more continuous seconds. White Cloud will move L to R meters. It wants to know how many different ways there are to achieve its goal. Two ways are different if and only if they move different meters or spend different seconds or in one second, one of them walks and the other runs.
입력 설명:
The first line of input contains 2 integers Q and k.Q is the number of queries.(Q<=100000,2<=k<=100000)
For the next Q lines,each line contains two integers L and R.(1<=L<=R<=100000)
출력 설명:
For each query,print a line which contains an integer,denoting the answer of the query modulo 1000000007.
예시 1
입력
복제 하 다.
3 3
3 3
1 4
1 5
출력
복제 하 다.
2
7
11
제목: 한 사람 이 한 번 에 1m 를 걷 거나 한 번 에 k m 를 뛰 는 것 을 선택 할 수 있 습 니 다. L 에서 R 까지 몇 가지 방법 이 있 는 지 물 어 볼 수 있 습 니 다.
사고: dp 유도, dp [i] [0] 은 i 미터 로 가 는 방법 수 를 나타 내 고 dp [i] [1] 은 i 미터 로 달 려 가 표시 하 는 방법 수 를 나타 낸다. 그러면 i 미터 까지 걸 어 오 는 방법 수 는 i - 1m 에서 걸 어 오 는 방법 과 뛰 어 오 는 방법 으로 얻 을 수 있다. 그러면 i 미터 에서 뛰 어 오 는 방법 수 는 i - k 미터 방법 으로 얻 을 수 있다. 그러면 전달 식 을 얻 을 수 있다.
dp[i][0]=dp[i-1][0]+dp[i-1][1]
dp[i][1]=dp[i-k];
그 다음 에 우 리 는 하나의 배열 sum 으로 접두사 와 를 기록 합 니 다. 그러면 L 에서 R 까지 의 방법 수 는 sum [r] - sum [l - 1] 과 같 습 니 다. 나머지 를 주의 하면 됩 니 다.
아래 에 코드 를 첨부 합 니 다:
#include
using namespace std;
const int mod=1000000007;
int dp[100005][2];
int sum[100005];
int n,q,k,l,r;
void solve()
{
dp[0][0]=1;
for(int i=1;i<=1e5;i++)
{
dp[i][0]=(dp[i-1][0]%mod+dp[i-1][1]%mod)%mod;
if(i>=k) dp[i][1]=dp[i-k][0]%mod;
}
for(int i=1;i<=1e5;i++)
sum[i]=(sum[i-1]%mod+dp[i][0]%mod+dp[i][1]%mod+mod)%mod;
}l;
int main(){
cin>>q>>k;
solve();
while(q--)
{
scanf("%d %d",&l,&r);
printf("%d
",(sum[r]-sum[l-1]+mod)%mod);
}
return 0;
}
케 이 형의:
#include
#include
#include
#include
using namespace std;
typedef long long ll;
ll dp[100005][5];
ll dpp[100005];
int main()
{
ll Q,k;
while(~scanf("%lld %lld",&Q,&k)){
ll L,R;
memset(dp,0,sizeof(dp));
memset(dpp,0,sizeof(dpp));
for(ll i=1;i<=k;i++){
dp[i][1]=1;
dp[i][0]=0;
}
dp[k][0]=1;
for(ll i=1;i<=k;i++){
dpp[i]=(dp[i][1]+dp[i][0]+1000000007)%1000000007;
}
/*
dp[1][1]=1;
dp[1][3]=0;
dpp[1]=1;
dp[2][1]=1;
dp[2][3]=0;
dpp[2]=1;
dp[3][1]=1;
dp[3][3]=1;
dpp[3]=2;
*/
for(ll i=k+1;i<=100002;i++){
dp[i][1]=(dp[i-1][1]+dp[i-1][0]+1000000007)%1000000007;
dp[i][0]=dp[i-k][1];
dpp[i]=(dp[i][1]+dp[i][0]+1000000007)%1000000007;
}
//printf("----
");
//for(int i=1;i<=7;i++){
// printf("%d ",dpp[i]);
//}
//printf("----
");
for(ll i=2;i<=100002;i++){
dpp[i]=(dpp[i]+dpp[i-1]+1000000007)%1000000007;
}
while(Q--){
scanf("%lld%lld",&L,&R);
printf("%lld
",(dpp[R]-dpp[L-1]+1000000007)%1000000007);
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hihocoder 1323 텍스트 문자열 구간 dp OR 기억화 검색제목 링크 묘사 문자열 S를 지정하려면 최소한 몇 번의 삭제 작업이 필요합니다. S를 메모 문자열로 바꿀 수 있습니까? 한 번에 임의의 위치에 문자를 삽입하거나, 임의의 문자를 삭제하거나, 임의의 문자를 임의의 다른...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.