我们会发现对于一个乘积一定可以分解为2 3 5 7的倍数
然后就根据这个来做了预处理出每个数的幂次
总感觉数位DP用记忆化搜索更方便?
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define ll long long
using namespace std;
char c;
inline void read(ll &a)
{
a=0;do c=getchar();while(c<'0'||c>'9');
while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();
}
ll Pow3[1001];
ll Pow2[1001];
ll Pow5[1001];
ll Pow7[1001];
ll n;
const
ll Mod=102367;
struct Rec
{
ll x,cnt2,cnt3,cnt5,cnt7,res;
inline ll Hash(){
return ((x+cnt2*177+cnt3*2333+cnt5*6787+cnt7*323+res*641)%Mod+Mod)%Mod;}
inline friend bool operator !=(Rec a,Rec b)
{
return (a.x^b.x)|(a.res^b.res)|(a.cnt2^b.cnt2)|(a.cnt3^b.cnt3)|(a.cnt5^b.cnt5)|(a.cnt7^b.cnt7);
}
};
struct Hash
{
Rec Key;
ll Ans;
Hash*next;
}*Table[M