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. 隐藏Tomcat中间件名称及版本号

    目的 防止黑客利用Tomcat中间件及版本号有针对性发起攻击. 处理方法 输入命令方式 # 进入tomcat/lib目录 cd Tomcat目录/lib # 解决catalina.jar,备份Serv ...

  2. Vue——vuex使用、Router使用、localstorage、sessionstorage和cookie

    vuex使用 # vuex :状态管理器--->存数据(变量)的地方,所有组件都可以操作 在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理( ...

  3. SpringBoot开发简单接口流程

    SpringBoot开发接口 初始化 新建项目 (1)使用 IDEA 的过程,新建Project,左侧选 Spring Initializr,点Next (2)选 8 版本,点Next (3)左侧选择 ...

  4. Java反射源码学习之旅

    1 背景 前段时间组内针对"拷贝实例属性是应该用BeanUtils.copyProperties()还是MapStruct"这个问题进行了一次激烈的battle.支持MapStru ...

  5. C++面试八股文:技术勘误

    不知不觉,<C++面试八股文>已经更新30篇了,这是我第一次写技术博客,由于个人能力有限,出现了不少纰漏,在此向各位读者小伙伴们致歉. 为了不误导更多的小伙伴,以后会不定期的出勘误文章,请 ...

  6. Mysql基础篇(二)之函数和约束

    一. 函数 Mysql中的函数主要分为四类:字符串函数.数值函数.日期函数.流程函数 1. 字符串函数 常用函数如下: 函数 功能 CONCAT(S1, S2, ......Sn) 字符串拼接,将S1 ...

  7. SQL专家云回溯某时间段内的阻塞

    背景 SQL专家云像"摄像头"一样,对环境.参数配置.服务器性能指标.活动会话.慢语句.磁盘空间.数据库文件.索引.作业.日志等几十个运行指标进行不同频率的实时采集,保存到SQL专 ...

  8. 自动设置IP地址和自动获取IP地址bat批处理文件

    自动设置IP地址.bat Echo offecho  手动设置IP地址....Netsh interface IP Set Addr "本地连接" Static 192.168.1 ...

  9. 【Linq】Value cannot be null. (Parameter 'row')

    报错代码: 原因分析: Linq中左连接后,取值需要处理null值;如下图修改后恢复正常.

  10. elementui中deep的用法/deep/

    在做第一个vue项目时遇到了一个问题,在使用elementui中的Drawer(抽屉组件时),想要修改Drawer的标题,尝试着修改title的样式,但没有效果,尝试了很多方法,最后用/deep/解决 ...