#pragma once
#include<vector>usingnamespacestd;#include"../prime/prime-enumerate.hpp"// f(n, p, c) : n = pow(p, c), f is multiplicative functiontemplate<typenameT,T(*f)(int,int,int)>structenumerate_multiplicative_function{enumerate_multiplicative_function(int_n):ps(prime_enumerate(_n)),a(_n+1,T()),n(_n),p(ps.size()){}vector<T>run(){a[1]=1;dfs(-1,1,1);returna;}private:vector<int>ps;vector<T>a;intn,p;voiddfs(inti,longlongx,Ty){a[x]=y;if(y==T())return;for(intj=i+1;j<p;j++){longlongnx=x*ps[j];longlongdx=ps[j];if(nx>n)break;for(intc=1;nx<=n;nx*=ps[j],dx*=ps[j],++c){dfs(j,nx,y*f(dx,ps[j],c));}}}};template<typenameT,T(*f)(int,int,int)>usingenamurate_multiplicative_function=enumerate_multiplicative_function<T,f>;/**
* @brief 乗法的関数の列挙
*/
#line 2 "multiplicative-function/enumerate-multiplicative-function.hpp"
#include<vector>usingnamespacestd;#line 2 "prime/prime-enumerate.hpp"
#include<cmath>
#line 5 "prime/prime-enumerate.hpp"
usingnamespacestd;// Prime Sieve {2, 3, 5, 7, 11, 13, 17, ...}vector<int>prime_enumerate(intN){vector<bool>sieve(N/3+1,1);for(intp=5,d=4,i=1,sqn=sqrt(N);p<=sqn;p+=d=6-d,i++){if(!sieve[i])continue;for(intq=p*p/3,r=d*p/3+(d*p%3==2),s=2*p,qe=sieve.size();q<qe;q+=r=s-r)sieve[q]=0;}vector<int>ret{2,3};for(intp=5,d=4,i=1;p<=N;p+=d=6-d,i++)if(sieve[i])ret.push_back(p);while(!ret.empty()&&ret.back()>N)ret.pop_back();returnret;}#line 7 "multiplicative-function/enumerate-multiplicative-function.hpp"
// f(n, p, c) : n = pow(p, c), f is multiplicative functiontemplate<typenameT,T(*f)(int,int,int)>structenumerate_multiplicative_function{enumerate_multiplicative_function(int_n):ps(prime_enumerate(_n)),a(_n+1,T()),n(_n),p(ps.size()){}vector<T>run(){a[1]=1;dfs(-1,1,1);returna;}private:vector<int>ps;vector<T>a;intn,p;voiddfs(inti,longlongx,Ty){a[x]=y;if(y==T())return;for(intj=i+1;j<p;j++){longlongnx=x*ps[j];longlongdx=ps[j];if(nx>n)break;for(intc=1;nx<=n;nx*=ps[j],dx*=ps[j],++c){dfs(j,nx,y*f(dx,ps[j],c));}}}};template<typenameT,T(*f)(int,int,int)>usingenamurate_multiplicative_function=enumerate_multiplicative_function<T,f>;/**
* @brief 乗法的関数の列挙
*/