「codeforces - 542D」Superhero's Job
容易发现,如果将 \(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的更多相关文章
- 「CodeForces 581D」Three Logos
BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...
- 「CodeForces - 50C 」Happy Farm 5 (几何)
BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...
- 「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位置插 ...
- 「CodeForces - 717E」Paint it really, really dark gray (dfs)
BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...
- 「CodeForces 476A」Dreamoon and Stairs
Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...
- 「CodeForces 546B」Soldier and Badges 解题报告
CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...
- 「Codeforces 79D」Password
Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...
- 「Codeforces 468C」Hack it!
Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...
- 「Codeforces 724F」Uniformly Branched Trees
题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...
- 「codeforces - 1284G」Seollal
给定 \(n\times m\) 的网格图,有些格子有障碍,无障碍且相邻的格子之间连边形成图.保证 \((1, 1)\) 无障碍,保证无障碍格子连通. 将网格图黑白染色,相邻格子颜色不同,\((1, ...
随机推荐
- k8s实战案例之部署Zookeeper集群
1.Zookeeper简介 zookeeper是一个开源的分布式协调服务,由知名互联网公司Yahoo创建,它是Chubby的开源实现:换句话讲,zookeeper是一个典型的分布式数据一致性解决方案, ...
- Hbase的JavaAPI和数据存储
导入Maven依赖 <dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> ...
- celery笔记三之task和task的调用
本文首发于公众号:Hunter后端 原文链接:celery笔记三之task和task的调用 这一篇笔记介绍 task 和 task 的调用. 以下是本篇笔记目录: 基础的 task 定义方式 日志处理 ...
- 大数据实战手册-开发篇之IO
2.4 sparkContext IO:读 2.4.1 textFile # Load a text file and convert each line to a Row. lines = sc.t ...
- 提升性能的利器:深入解析SectionReader
一. 简介 本文将介绍 Go 语言中的 SectionReader,包括 SectionReader的基本使用方法.实现原理.使用注意事项.从而能够在合适的场景下,更好得使用SectionReader ...
- requests的基础使用
爬虫介绍 # 爬虫:又称网络蜘蛛,spider,一堆程序,从互联网中抓取数据---->数据清洗---->入库 # 爬虫需要掌握的知识 -抓取数据:发送网络请求(http),获得响应(htt ...
- linux150常用命令
Linux最常用150个命令汇总 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作 ...
- [渗透测试]—4.2 Web应用安全漏洞
在本节中,我们将学习OWASP(开放网络应用安全项目)发布的十大Web应用安全漏洞.OWASP十大安全漏洞是对Web应用安全风险进行评估的标准,帮助开发者和安全工程师了解并防范常见的安全威胁. 1. ...
- 快速实现 CDN 直播
功能简介 ZEGO Express SDK 支持推流到 CDN(Content Delivery Network,内容分发网络),包括转推 CDN 和直推 CDN 两种功能.开发者基于该功能可打通 R ...
- 智能制造之路—从0开始打造一套轻量级MOM平台
一.概述 面对数字化浪潮,MOM需求迈入上升期,数字化从"可选项"变成了企业竞争"必选项".制造行业每个工厂的生产逻辑都不尽相同,流程的梳理.数据统一化都需要调 ...