「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, ...
随机推荐
- 尚医通-day14【创建订单】(内附源码)
页面预览 订单详情 订单列表 第01章-创建订单 生成订单分析 生成订单方法参数:就诊人id与 排班id 生成订单需要获取就诊人信息(微服务远程调用service-user) 获取排班信息与规则信息( ...
- Hexo博客Next6.0版本主题配置(背景图片加载、侧边栏社交小图标设置、设置网站图标)
随机背景图片加载 原理 自动更换背景是修改添加背景的css样式实现 图片来源 https://source.unsplash.com/ 修改背景样式 修改themes\next\source\css\ ...
- Redis和Mysql保持数据一致性
1.简述 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题.所以,我们都会用Redis来做数据的缓存,削减对数据库的请求.但是,Mysql和Redis是两种不同的数据库,如何保证不 ...
- ABP 的ajax请求错误:400 Empty or invalid anti forgery header token.
ABP 的ajax请求错误 记录于2018-03-22 13:31:16 星期四 错误信息:400 Empty or invalid anti forgery header token. 我从网上找到 ...
- 【技术实战】Vue技术实战【一】
需求实战一 组件来源 ant-design-vue Button 按钮 Progress 进度条 效果展示 代码展示 <template> <ARow> <ACol> ...
- 你真正了解Spring的工作原理吗
Spring 1.1 什么是Spring IOC 和DI ? ① 控制反转(IOC):Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring ...
- vulnhub_me and my grilfriend
解题步骤 主机nmap扫描,开放22和80端口 访问该ip,发现只能本地访问 查看源代码,提示需要使用x-forwarded-for的请求头,可以在burp suite中每次添加一个请求头,也可以使用 ...
- linux文本编辑YCM报错
linux文本编辑YCM报错 刚从github安装了vimplus,可是发现存在不少的问题.索性给直接记录一下. The ycmd server SHUT DOWN (restart with ':Y ...
- GoRedisLock:Golang保障数据一致性的分布式锁解决方案
在现代分布式系统中,多个节点之间共享资源是常见的需求.然而,并发访问共享资源可能导致数据不一致性和竞争条件.为了解决这些问题,我们需要引入分布式锁.GoRedisLock是一个出色的分布式锁库,它结合 ...
- CF1601 题解
偶然看这一场的题目,忽然很有感觉,于是写了一下 A 题面 考虑每一位可以单独分开考虑 考虑单独的一位,每次要选 \(m\) 个位置,可能产生贡献的位置就是这位为 1 的数,设数量为 \(x\),则 \ ...