int main(){ const long long M = 1000000007; const long long L = 100001; long t, k; scanf("%ld %ld\n", &t, &k); std::vector<long long> array(L, 0); for(long p = 0; p < k; p++){array[p] = 1;} for(long p = k; p <= L; p++){array[p] = (array[p - 1] + array[p - k]) % M;} std::vector<long long> cumulative(L, 0); cumulative[0] = 1; for(long p = 1; p <= L; p++){cumulative[p] = (cumulative[p - 1] + array[p]) % M;} while(t--){long a, b; scanf("%ld %ld\n", &a, &b); printf("%lld\n", (2 * M + cumulative[b] - cumulative[a - 1]) % M);} return 0; }
void spread(void) { float min_cost; int ros_max, ros_base, dir; int row, col; int cell_count = 0, ncells = 0; struct cell_ptrHa *to_cell, *old_to_cell; struct costHa *pres_cell; /* initialize using arbitrary value, this value is never used except for debug */ min_cost = 0; ncells = nrows * ncols; G_message ("Finding spread time - number of cells visited in percentage ... %3d%%", 0); pres_cell = (struct costHa *)G_malloc(sizeof(struct costHa)); get_minHa(heap, pres_cell, heap_len); G_debug(2, "begin spread: cost(%d,%d)=%f", pres_cell->row, pres_cell->col, pres_cell->min_cost); G_debug(2, " heap_len=%ld pres_cell->min_cost=%f time_lag=%d", heap_len, pres_cell->min_cost, time_lag); while (heap_len-- > 0 && pres_cell->min_cost < init_time + time_lag + 1.0) { ros_max = DATA(map_max, pres_cell->row, pres_cell->col); ros_base = DATA(map_base, pres_cell->row, pres_cell->col); dir = DATA(map_dir, pres_cell->row, pres_cell->col); /*Select end cells of links of the present cell */ select_linksB(pres_cell, least / 2, comp_dens); #ifdef DEBUG to_cell = front_cell; while (to_cell != NULL) { printf("(%d,%d) ", to_cell->row, to_cell->col); to_cell = to_cell->next; } #endif /*Get a cell in the list each time, and compute culmulative costs *via the current spread cell*/ to_cell = front_cell; while (to_cell != NULL) { /*calculate cumulative costs, *function returns -1 if detected a barrier */ if (cumulative (pres_cell, to_cell, ros_max, ros_base, dir, &min_cost) == -1) { old_to_cell = to_cell; to_cell = to_cell->next; front_cell = to_cell; G_free(old_to_cell); continue; } G_debug(2, " finish a link: cost(%d,%d)->(%d,%d)=%f", pres_cell->row, pres_cell->col, to_cell->row, to_cell->col, min_cost); /*update the cumulative time/cost */ update(pres_cell, to_cell->row, to_cell->col, to_cell->angle, min_cost); old_to_cell = to_cell; to_cell = to_cell->next; front_cell = to_cell; G_free(old_to_cell); } /*compute spotting fires */ if (spotting) spot(pres_cell, dir); /*mark a visited cell */ DATA(map_visit, pres_cell->row, pres_cell->col) = YES; #if 0 if (display) draw_a_cell(pres_cell->row, pres_cell->col, (int)pres_cell->min_cost); #endif cell_count++; if ((100 * cell_count / ncells) % 2 == 0 && (100 * (cell_count + (int)(0.009 * ncells)) / ncells) % 2 == 0) { G_percent(cell_count, ncells, 2); } get_minHa(heap, pres_cell, heap_len); G_debug(2, "in while: heap_len=%ld pres_cell->min_cost=%f time_lag=%d", heap_len, pres_cell->min_cost, time_lag); } /*end 'while (heap_len-- >0)' */ G_free(pres_cell); /*Assign min_cost values to un-reached area */ for (row = 0; row < nrows; row++) { for (col = 0; col < ncols; col++) { if (!DATA(map_visit, row, col)) { DATA(map_out, row, col) = (float)BARRIER; if (x_out) DATA(map_x_out, row, col) = 0; if (y_out) DATA(map_y_out, row, col) = 0; } } } G_debug(2, "end spread"); } /*end spread () */