link。

容易发现,如果将 \(x\) 写作 \(\displaystyle \prod_{i = 1}^k p_i^{\alpha_i}\) 的形式,\(\displaystyle J(x) = 1+\sum p_i^{\alpha_i}+\sum\sum p_i^{\alpha_i}p_j^{\alpha_j}+\dots = \sum_{T \in 2^S} \sum_{i \in T} p_i^{\alpha_i}\),其中 \(S = \{1, \dots, k\}\)。写到这里可以发现 Joker function 是个 multiplicative function,所以 Joker function 又可以写作 \(\displaystyle J(x) = \prod_{i = 1}^k J(p_i^{\alpha_i}) = \prod_{i = 1}^k \left(p_i^{\alpha_i}+1\right)\)。

考虑 dp,设 \(f[i][j]\) 表示用前 \(i\) 个因数通过上述形式凑出 \(j\) 的方案数,转移很平凡,具体看代码。这个 dp 可以用数据结构来存。这个 dp 复杂度的保证在于 \(\displaystyle \max_{i \in [1, 10^{12}]} {\sigma_0(i)} = 6720\),这就叫人比较无语。至于判断一个数是否是 \(p^k+1\) 的形式,可以根号分治来做,记阈值为 \(T = 10^6\),对于 \(\leqslant T\) 的元素,可以线性筛出所有质数,标记所有质数的次幂,数量级粗略是 \(O(T\log T)\),完全跑不满;对于 \(> T\) 的元素,因为 \((T+1)^2 > 10^{12}\),所以只需要判断是否为质数即可,Miller Rabin 或者其他 nb 的判素数方法即可。写不来 MR 所以直接蒯了个 mrsrz 的。

namespace Miller_Rabin{
const int P[]={2,3,7,97,19260817};
inline LL mul(LL a,LL b,const LL&md){
LL tmp=a*b-(LL)((long double)a*b/md+.5)*md;
return tmp+(tmp>>63&md);
}
inline LL pow(LL a,LL b,const LL&md){
LL ret=1;
for(;b;b>>=1,a=mul(a,a,md))if(b&1)ret=mul(ret,a,md);
return ret;
}
bool test(LL a,LL p){
LL x=p-1;
int d=0;
while(!(x&1))++d,x>>=1;
LL t=pow(a,x,p);
while(d--){
const LL ls=t;
t=mul(t,t,p);
if(t==1&&ls!=1&&ls!=p-1)return 0;
}
return t==1;
}
bool check(LL n){
if(n<2)return 0;
if(n==2||n==3||n==7||n==97||n==P[4])return 1;
for(int i=0;i<5;++i)if(n%P[i]==0)return 0;
for(int i=0;i<5;++i)
if(!test(P[i]%n,n))return 0;
return 1;
}
}
using Miller_Rabin::check;
LL A;
bitset<1000100> tag;
int prm[1000100], cnt;
map<LL, int> mp; // a in it iff a = p^k
bastr<LL> offset[2000100];
void sieve(int n) {
for (int i=2; i<=n; ++i) {
if (!tag.test(i)) {
prm[++cnt] = i;
}
for (int j=1; j<=cnt && i<=n/prm[j]; ++j) {
tag.set(i*prm[j]);
if (i%prm[j] == 0) {
break;
}
}
}
for (int i=1; i<=cnt; ++i) {
for (LL j=prm[i]; j<=1e12; j*=prm[i]) {
mp[j] = i;
}
}
}
void executer() {
cin >> A;
map<LL, LL> dp[2];
bastr<int> eff;
for (LL i=1; i<=A/i; ++i) {
if (A%i == 0) {
if (mp.count(i-1)) {
offset[mp[i-1]] += i;
eff += mp[i-1];
}
if (i*i != A) {
if (mp.count(A/i-1)) {
offset[mp[A/i-1]] += A/i;
eff += mp[A/i-1];
}
else if (check(A/i-1)) {
offset[++cnt] += A/i;
eff += cnt;
}
}
}
}
sort(eff.begin(), eff.end());
eff.erase(unique(eff.begin(), eff.end()), eff.end());
dp[0][1] = 1;
int cur = 1;
for (auto u : eff) {
dp[cur] = dp[cur^1];
for (auto v : dp[cur^1]) {
for (auto p : offset[u]) {
if (A/p >= v.first && A%(v.first*p) == 0) {
dp[cur][v.first*p] += v.second;
}
}
}
cur ^= 1;
}
cout << dp[cs(eff)&1][A] << "\n";
}

「codeforces - 542D」Superhero's Job的更多相关文章

  1. 「CodeForces 581D」Three Logos

    BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...

  2. 「CodeForces - 50C 」Happy Farm 5 (几何)

    BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...

  3. 「CodeForces - 598B」Queries on a String

    BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...

  4. 「CodeForces - 717E」Paint it really, really dark gray (dfs)

    BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...

  5. 「CodeForces 476A」Dreamoon and Stairs

    Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...

  6. 「CodeForces 546B」Soldier and Badges 解题报告

    CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...

  7. 「Codeforces 79D」Password

    Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...

  8. 「Codeforces 468C」Hack it!

    Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...

  9. 「Codeforces 724F」Uniformly Branched Trees

    题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...

  10. 「codeforces - 1284G」Seollal

    给定 \(n\times m\) 的网格图,有些格子有障碍,无障碍且相邻的格子之间连边形成图.保证 \((1, 1)\) 无障碍,保证无障碍格子连通. 将网格图黑白染色,相邻格子颜色不同,\((1, ...

随机推荐

  1. 为什么要学习 Markdown?究竟有什么用?

    点击上方蓝字设为星标 下面开始今天的学习- 本文经授权转载自微信公众号:杰哥的 IT 之旅(ID:Jake_Internet),未经许可,禁止二次转载. 一.什么是 Markdown? Markdow ...

  2. 为什么 Biopython 的在线 BLAST 这么慢?

    用过网页版本 BLAST 的童鞋都会发现,提交的序列比对往往在几分钟,甚至几十秒就可以得到比对的结果:而通过调用 API 却要花费几十分钟或者更长的时间!这到底是为什么呢? NCBIWWW 基本用法 ...

  3. API NEWS | Money Lover爆出潜在API漏洞

    欢迎大家围观小阑精心整理的API安全最新资讯,在这里你能看到最专业.最前沿的API安全技术和产业资讯,我们提供关于全球API安全资讯与信息安全深度观察. 本周,我们带来的分享如下: Money Lov ...

  4. Hugging News #0616: 有几项非常重要的合作快来围观、最新中文演讲视频回放发布!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  5. EnhancingDecisionTreeswithGeographicInformationSystemsa

    目录 引言 在计算机科学领域,地理信息系统和( geographical information systems, GIS)已经成为了一个非常受欢迎的工具.GIS 可以用来处理和存储大量的地理数据,支 ...

  6. PHP代码获取网址参数的数据,请收藏。

    <? echo $_SERVER['HTTP_HOST']."<br>"; #localhost echo $_SERVER['PHP_SELF']." ...

  7. Jenkins快速入门部署+实践

    安装 方法一 Jenkins中文网下载jenkins.war 方法二 直接从http://mirrors.jenkins-ci.org/war/latest/jenkins.war下载最新的war包, ...

  8. PTA 21级数据结构与算法实验7—查找表

    目录 7-1 电话聊天狂人 7-2 两个有序序列的中位数 7-3 词频统计 7-4 集合相似度 7-5 悄悄关注 7-6 单身狗 7-7 词典 7-8 这是二叉搜索树吗? 7-9 二叉搜索树 7-1 ...

  9. 最全面的JAVA多线程知识总结

    ​ 背景: 2023年经营惨淡,经历了裁员就业跳槽再就业,在找工作过程中对于知识的梳理和总结,本文总结JAVA多线程. 应用场景: 需要同时执行多个任务或处理大量并发请求时, 目前常用的场景有: We ...

  10. 2022-1-10 控件学习2 Button、CheckBox、RadioButton、PasswordBox、Image、ToolTip

    Button         设置带图片的按钮: 设置button按钮通用类型:  CheckBox          IsChecked设置是否选中 RadioButton 使用GroupName这 ...