Lindo tema
Hay una secuencia \ (a \) de longitud \ (n \) , necesita contar cuántas subsecuencias hay en \ (b \) . Una secuencia \ (b \) se define como excelente si y solo si: \ (\ forall i \ en [1, k], i | b_ {i} \) . La respuesta es módulo \ (10 ^ 9 + 7 \) .
\(Solución\)
Las tarjetas a menudo cuentan buenas preguntas
Debido a que esta es una pregunta en el tema dp , hacemos que \ (f_ {i, j} \) signifique usar los primeros dígitos \ (i \) en \ (a \) para formar un hijo de longitud \ (j \) El número de esquemas de la secuencia entonces obviamente \ (f_ {i, j} = f_ {i-1, j} + f_ {i-1, j-1} \ times [j \, | \, a_i] \) y luego El hijo es \ (n ^ 2 \) , obviamente \ (TLE \) , considere optimizar la complejidad del tiempo porque hay una cosa en la fórmula: \ ([j \, | \, a_i] \) , entonces seguimos la rutina Para enumerar los factores primos de \ (a_i \) \ (j \) , entonces: \ (f_ {i, j} = \ sum {f_ {i, j-1}} \) , donde \ (j \) es \ El factor primo de (a_i \) Luego descubrimos que esta es en realidad una forma de mochila \ (01 \) , por lo que consideramos primero encontrar todos los factores primos de \ (a_i \) y ordenarlos en orden inverso de pequeño a grande \ (dp \) , Esto ahorra espacio unidimensional al desplazarse
Advertencia del FBI: El siguiente es un error de Konjac, tal vez soy el único que lo hizo. Si no desea perder el tiempo, puede ver directamente la parte del código
Al principio , solo había \ (60pts \) en \ (gdfzoj \) , y en el octavo punto \ (T \) en \ (Codeforces \) , y luego la tarjeta a menudo cambiaba primero el rango de subíndice de la matriz. el \ (memset \) tiempo, reducir \ (10 \) tiempos, además de una variedad de rutinas de tarjeta menudo, en \ (\ codeforces) en más, entonces la gallina aún no había \ (gdfzoj \) en \ (1000 ms \) El límite de tiempo del
tumorfinalmente se encuentra que el \ (memset \) en realidad se puede guardar, porque el valor posterior sobrescribirá el original. Entonces, la lección de sangre: \ (memset \) puede aumentar el orden de magnitud de la complejidad del tiempo (en realidad es Soy el único que no sabe).
\(Código:\)
#include<bits/stdc++.h>
using namespace std;
namespace my_std
{
typedef long long ll;
typedef double db;
#define pf printf
#define pc putchar
#define fr(i,x,y) for(register ll i=(x);i<=(y);++i)
#define pfr(i,x,y) for(register ll i=(x);i>=(y);--i)
#define go(x) for(ll i=head[u];i;i=e[i].nxt)
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,127,sizeof(a))
#define enter pc('\n')
#define space pc(' ')
#define fir first
#define sec second
#define MP make_pair
const ll inf=0x3f3f3f3f;
const ll inff=1e15;
inline ll read()
{
ll sum=0,f=1;
char ch=0;
while(!isdigit(ch))
{
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch))
{
sum=sum*10+(ch^48);
ch=getchar();
}
return sum*f;
}
inline void write(ll x)
{
if(x<0)
{
x=-x;
pc('-');
}
if(x>9) write(x/10);
pc(x%10+'0');
}
inline void writeln(ll x)
{
write(x);
enter;
}
inline void writesp(ll x)
{
write(x);
space;
}
}
using namespace my_std;
const unsigned long long N=1e5+50;
const unsigned long long mod=1e9+7;
ll n,a[N],d[N],f[N*10],dcnt,ans;
inline bool cmp(ll a,ll b){return a>b;}
int main(void)
{
n=read();
fr(i,1,n) a[i]=read();
f[0]=1;
fr(i,1,n)
{
dcnt=0;
//memset(d,0,sizeof(d));
fr(j,1,sqrt(a[i]))
{
if(a[i]%j!=0) continue;
d[++dcnt]=j;
if(j*j!=a[i]) d[++dcnt]=a[i]/j;
}
sort(d+1,d+dcnt+1,cmp);
fr(j,1,dcnt) f[d[j]]=(f[d[j]]+f[d[j]-1])%mod;
}
fr(i,1,n) ans=(ans+f[i])%mod;
writeln(ans);
return 0;
}