fjutacm 1593 doble secuencia dp lineal

Descripción del problema
satisfecho además del primer número de secuencia en cada número de secuencia es un múltiplo de su antigua se conoce como una secuencia de números duplicado ahora requiere doble secuencia satisfacen las siguientes condiciones: Todos los elementos 1 1 ~ n es una secuencia de 2. se requiere la longitud de la secuencia de número entero positivo k para satisfacer un número tal secuencia se duplica de varias maneras. Dado que la respuesta a una, la respuesta de salida grande MOD 1000000007 (10 ^ 9 + 7 )

De entrada
de datos de entrada comprende una pluralidad de series de cada línea de datos de dos números enteros n, k. (1 <= n, k < = 2.000)

De salida
para cada entrada de datos, da salida a un número entero respuesta

SampleInput
3 2
6 4
2 1

SampleOutput
5
39
2

El título es en realidad muy buena comprensión, a continuación, vamos a comenzar con el método más simple es probablemente otra vez, de acuerdo con las condiciones del número de secuencia de la primera posición puede ser de 1 ~ n, n es posible, en segundo lugar es el primero de varios largos múltiplos, todo serán seleccionados. Es decir, sobre todo porque la primera base dígitos si es 1, que traerá un gran número de posibles de una sola vez, y esta situación es inevitable, por lo que tenemos claro dos puntos: En primer lugar, la violencia no es deseable, el segundo paso en un módulo necesario.

En realidad pensé este blog de la tercera edad: https: //www.cnblogs.com/qq136155330/p/9102857.html. Pero yo mismo durante mucho tiempo para digerir, reorganizado un poco.

En primer lugar, hay que tener claro qué dirección. ¿Por dp? Debido a que cuidadosamente pensamos que no es difícil de saber, de conformidad con la normativa de la materia, la posibilidad de una doble secuencia por su último elemento (más tarde conocido como la mantisa) las limitaciones de tamaño, y los mismos dos longitudes, que termina en una secuencia diferente llevado al duplicar no existe una relación entre las posibilidades, pero con diferentes longitudes, la secuencia brinda la posibilidad de-dos veces la velocidad de la mantisa es más largo mantisa más corto duplicar la posibilidad de más tiempo debe pasar más corto transferir disponibles, sólo mucho más.

Por ejemplo, hemos sido proporcionado con una longitud de 1, la posibilidad de doble secuencia de terminación 2 se lleva DP [1] [2], a continuación, dp [2] [4], dp [2] [6], dp [3] [2], dp [3] [4] sólo será dp [2] además de nuevas posibilidades para los dígitos adicionales son causados ​​por [1].

A continuación, hay mucho que decir imaginaria, combinado con las ideas concretas código decir.

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <math.h>
#include <iostream>
const int MAX=2e3+5;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dp[MAX][MAX]; /// dp[l][i],l代表长度,i代表尾数

int main()
{
  int i, j, n, k, l;
  /// 因为我们知道,较长的翻倍序列和较短的通过尾数相关联,所以这里我们先做
  ///好预处理,把所有长度下的所有尾数情况带来的可能性都一一预先处理好。
  for (i=1; i<MAX; i++)
    dp[1][i] = 1;/// 长度为1的时候,不论尾数是几,整个序列都只有自己1种可能
  for (l=2; l<MAX; l++)/// 从长度为2的序列开始处理到完
    for (i=1; i<MAX; i++)
      for (j=i; j<MAX; j+=i)
        dp[l][j] = (dp[l][j]+dp[l-1][i])%1000000007;
/// 这里通过遍历上1长度的所有尾数情况带来的可能性,在当前长度中寻找尾数对应
///成倍数的位置,进行状态转移。一步一取模。
        
        
  int ans;
  while (cin>>n>>k)
  {
    ans = 0;
    for (i=1; i<=n; i++)
      ans = (ans+dp[k][i])%1000000007;
    /// 既然给定了长度k和尾数上限n,那把长度k下尾数为1~n的所有情况的可能都
    ///加起来就行了。一步一取模
    cout << ans << endl;
  }
  return 0;
}

Se han publicado 19 artículos originales · ganado elogios 0 · Vistas 496

Supongo que te gusta

Origin blog.csdn.net/qq_43317133/article/details/102001120
Recomendado
Clasificación