数论好题 CF900D
前置推导
令
很显然
因为
所以
根据
令
大致思路
我们现在的目标是求出
总个数
先来计算总个数,显然我们当前求解的问题相当于求
因为
所以可以考虑插板法,设当前要把
方法 (暴力)
所以总方案数为
根据二项式定理
令
则
所以
方法 (人类智慧)
因为空位只有选和不选两种情况,一共有
不满足条件的个数
令函数
所以
再根据容斥原理得
即
求解
递归求解
时间复杂度
#include <bits/stdc++.h>
#define int long long
#define Add(x, y) x = add(x, y)
#define Mul(x, y) x = mul(x, y)
std :: map <int, int> ans;
int x, y; const int mod = 1e9 + 7;
int mul(int x, int y) { return x * y % mod; }
int add(int x, int y) { return (x + y) % mod; }
int qpow(int x, int y) {
int ans = 1; while(y) {
if(y & 1) ans = mul(ans, x);
x = mul(x, x), y >>= 1;
} return ans;
}
int calc(int o) {
if(o == 1) return 1;
if(ans[o]) return ans[o];
int res = calc(1);
for(int i = 2; i * i <= o; ++ i) {
if(o % i) continue;
Add(res, add(calc(i), (i * i != o) * calc(o / i)));
} return ans[o] = add(qpow(2, o - 1), -res);
}
signed main() {
scanf("%lld%lld", &x, &y);
if(y % x) return puts("0");
printf("%lld", add(mod, calc(y / x)));
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现