
codeforces900D 2100分莫比乌斯反演
发布日期:2021-05-06 15:23:14
浏览次数:34
分类:精选文章
本文共 1176 字,大约阅读时间需要 3 分钟。
题意:
正整数序列 ,序列的
是
,并且序列之和是
。
问这样的序列个数,答案取模。
数据范围: 。
题解:
容易发现存在这样的序列等价于 。
简化一下题意,这样的序列是 是
,并且序列之和是
。
是
,并且序列之和是
的函数
是不好求的。
序列之和是 的函数
是很好求的。
这样就考虑莫比乌斯反演了。
想一想会发现, 。
反演一下, 。
通过插板法可以知道 。
感受:
容斥题,可以考虑莫比乌斯反演。
代码:
#includeusing namespace std ;typedef long long ll ;const ll mod = 1e9 + 7 ;ll qpow(ll a , ll b){ ll ans = 1 ; a %= mod ; while(b) { if(b & 1) ans = (ans * a) % mod ; b >>= 1 , a = (a * a) % mod ; } return ans % mod ;}ll get_mu(ll n){ ll x = n , temp = n ; ll cnt = 0 , now = 0 ; for(ll i = 2 ; i * i <= x ; i ++) { now = 0 ; if(x % i == 0) { while(x % i == 0) now ++ , x /= i ; if(now > 1) return 0 ; cnt ++ ; } } if(x != 1) cnt ++ ; return (cnt & 1) ? -1 : 1 ;}ll g(ll x){ return qpow(2ll , x - 1) ;}void solve(ll x){ ll ans = 0 ; for(ll d = 1 ; d * d <= x ; d ++) { if(x % d != 0) continue ; ans += get_mu(d) * g(x / d) ; if(d * d != x) ans += get_mu(x / d) * g(d) ; ans %= mod ; } ans = (ans + mod) % mod ; printf("%lld\n" , ans) ;}int main(){ ll x , y ; scanf("%lld%lld" , &x , &y) ; if(y % x != 0){printf("0\n") ; return 0 ;} solve(y / x) ; return 0 ;}
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月12日 07时38分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
sharding-jdbc 分库分表的 4种分片策略,还蛮简单的
2021-05-09
分库分表的 9种分布式主键ID 生成方案,挺全乎的
2021-05-09
MySQL不会丢失数据的秘密,就藏在它的 7种日志里
2021-05-09
Python开发之序列化与反序列化:pickle、json模块使用详解
2021-05-09
回顾-生成 vs 判别模型-和图
2021-05-09
采坑 - 字符串的 "" 与 pd.isnull()
2021-05-09
无序列表 - 链表
2021-05-09
SQL 查询强化 - 数据准备
2021-05-09
SQL 强化练习 (四)
2021-05-09
Excel 拼接为 SQL 并打包 exe
2021-05-09
Pandas数据分析从放弃到入门
2021-05-09
Matplotlib绘制漫威英雄战力图,带你飞起来!
2021-05-09
机器学习是什么
2021-05-09
《小王子》里一些后知后觉的道理
2021-05-09
《自私的基因》总结
2021-05-09
《山海经》总结
2021-05-09
《非暴力沟通》总结
2021-05-09
《你当像鸟飞往你的山》总结
2021-05-09
《我是猫》总结
2021-05-09
《抗糖化书》总结
2021-05-09