首页 > 其他分享 >[ARC182C] Sum of Number of Divisors of Product 题解

[ARC182C] Sum of Number of Divisors of Product 题解

时间:2024-08-26 13:37:09浏览次数:6  
标签:Product ch cur int 题解 Sum ans merge vi

题目链接

点击打开链接

题目解法

我怎么不会分治/fn

首先把 \(x\) 分解成 \(\prod p_i^{x_i}(0\le i\le 5)\) 的形式,正因数个数为 \(\prod (x_i+1)\)
有一个很牛的想法是:合并两个 \(x_i\) 序列(假设一个叫 \(x_0,...,x_5\),另一个叫 \(y_0,...,y_5\))
先不考虑后面的 \(+1\)(可以最后在合并上去),想一想 \((x_0+y_0)(x_1+y_1)...(x_5+y_5)\) 的意义是什么?
我们把括号拆开,意义是选择一个 \(0,...,5\) 的子集,集合内的用 \(x\) 乘,集合外的用 \(y\) 乘,即维护出子集的乘积和,就能轻松合并两个序列

这样就简单了,我们倍增求答案即可
因为要求的是历史和,所以当前值和历史和都维护即可
时间复杂度 \(O(60\times 3^6)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int P=998244353,M=1<<6;
LL n;
int m,pr[6]={2,3,5,7,11,13};
typedef vector<int> vi;
vi f[60],g[60];
inline void inc(int &x,int y){ x+=y;if(x>=P) x-=P;}
vi merge(vi v1,vi v2){
    vi rec(M,0);
    F(S,0,M-1)
        for(int T=S;;T=(T-1)&S){
            inc(rec[S],1ll*v1[T]*v2[S^T]%P);
            if(!T) break;
        }
    return rec;
}
int main(){
    read(n),read(m);
    f[0].resize(M);
    F(i,1,m)
        F(S,0,M-1){
            int x=i,val=1;
            F(j,0,5) if(S>>j&1){
                int c=0;
                while(x%pr[j]==0) c++,x/=pr[j];
                val*=c;
            }
            inc(f[0][S],val);
        }
    g[0]=f[0];
    F(i,1,59){
        g[i]=merge(g[i-1],g[i-1]);
        f[i]=merge(f[i-1],g[i-1]);
        F(j,0,M-1) inc(f[i][j],f[i-1][j]);
    }
    vi ans(M,0),cur(M,0);
    bool fir=1;
    F(i,0,59) if(n>>i&1){
        if(fir) ans=f[i],cur=g[i],fir=0;
        else{
            vi t=merge(cur,f[i]);
            F(j,0,M-1) inc(ans[j],t[j]);
            cur=merge(cur,g[i]);
        }
    }
    ans=merge(ans,vi(M,1));
    printf("%d\n",ans[M-1]);
    return 0;
}

标签:Product,ch,cur,int,题解,Sum,ans,merge,vi
From: https://www.cnblogs.com/Farmer-djx/p/18380843

相关文章

  • 题解:AT_arc183_b [ARC183B] Near Assignment
    题意:给你长度为\(N\)的整数序列\(A,B\)以及整数\(K\)。你可以执行下列操作零次或多次。选择整数\(i\)和\(j\)(\(1\leqi,j\leqN\))。这里,\(|i-j|\leqK\)必须保持不变。然后,将\(A_{i}\)的值改为\(A_{j}\)。判断是否有可能使\(A\)与\(B\)相同。分......
  • 常见问题解决 --- 如何给一个不支持配置代理的程序抓取https流量数据
    比如我有一个C#编写票务系统,它内嵌浏览器功能,我想抓取它的流量,但是这个客户端不支持配置代理设置解决办法:1.安装配置proxifier开启全局代理服务。安装好后网上有激活码激活一下,点击profile-proxyserver,添加一个代理服务器127.0.0.1,端口8080,协议https。点击profile-prox......
  • Java | Leetcode Java题解之第374题猜数字大小
    题目:题解:publicclassSolutionextendsGuessGame{publicintguessNumber(intn){intleft=1,right=n;while(left<right){//循环直至区间左右端点相同intmid=left+(right-left)/2;//防止计算时溢出......
  • Hitachi Vantara Programming Contest 2024(AtCoder Beginner Contest 368)题解A~D
    A-Cut题意:将数组的后k个字符移到前面思路:可以用rotate()函数让数组中的元素滚动旋转rotate(v.begin(),v.begin()+n-k,v.end());直接输出后k个元素,再输出前n-k个元素for(inti=n-k;i<n;i++)write(v[i]);for(inti=0;i<n-k;i++)write(v[i]);B-Decrease2......
  • 题解:AT_joisc2017_f 鉄道旅行 (Railway Trip)
    题意鉄道旅行(RailwayTrip)分析非常神仙的倍增做法。我们设\(l_{i,j}\)表示从\(i\)点出发,停靠\(2^j\)站后能抵达的最左位置。同理设\(r_{i,j}\)表示从\(i\)点出发,停靠\(2^j\)站后能抵达的最右位置。考虑如何更新这两个状态。因为可以走回头路,所以简单的\(l......
  • 题解:SP3109 STRLCP - Longest Common Prefix
    三倍经验:UVA11996JewelMagicP4036[JSOI2008]火星人题意维护一个字符串\(S\),支持以下操作:\(Q\i\j\):输出\(\operatorname{LCP}(S[i\dotsl],S[j\dotsl])\)\(R\i\char\):用\(char\)替换\(S\)的第\(i\)个字符\(I\i\char\):在\(S\)的第\(i\)......
  • 题解:CF590E Birthday
    题目分析题意给定\(n\)个字符串,要求从中选出若干个组成一个集合,且集合中每个字符串都互不包含。求集合最大包含几个字符串。分析本题弱化版:[ABC354G]SelectStrings就是求一个最长反链,并求构造方案。求构造方案还是比较有意思的。建议先做P4298[CTSC2008]祭祀。一......
  • 题解:P5217 贫穷
    题意维护一个字符串,支持以下操作:\(\texttt{Ixc}\),在第\(x\)个字母后面插入一个\(c\)。\(\texttt{Dx}\),删除第\(x\)个字母。\(\texttt{Rxy}\),反转当前文本中的区间\([x,y]\)。\(\texttt{Px}\),输出初始文本中第\(x\)个字母在当前文本中的位置。特别地,若不存在,......
  • 题解:UVA11996 Jewel Magic
    题意给你一个01串,要求完成以下操作:单点插入。单点删除。区间翻转。查询两点开始的LCP。分析先看查询操作,如何得到LCP的长度?我们可以考虑二分长度\(l\),然后用哈希检验区间\([p1,p1+l-1]\)是否等于区间\([p2,p2+l-1]\)。平衡树维护哈希即可。发现......
  • 题解:AT_abc354_g [ABC354G] Select Strings
    题目分析题意给定\(n\)个字符串,要求从中选出若干个组成一个集合,且集合中每个字符串都互不包含。求集合中字符串的权值的和的最大值。分析首先很容易想到用KMP判两个串是否存在包含关系。考虑建图,将不能同时存在于一个集合中的串的节点相连。然后发现只需求出这个图的最......