Solución CF1061C

Enlace del título

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 tumor finalmente 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;
}

Fin de rociar flores !!!

Supongo que te gusta

Origin www.cnblogs.com/lgj-lgj/p/12688436.html
Recomendado
Clasificación