P7976 解题报告
题目传送门
题目大意:
设函数
思路:
看到奇奇怪怪的组合数求和首先考虑
其中
接着注意到
对于每一个
- 当
时, 取 的时候有贡献,此时这一位的值为 ; - 当
时, 取 的时候有贡献,此时这一位的值为 ; - 当
时, 取 的时候有贡献,此时这一位的值为 。
而乘
然后就会发现统计一下三进制表示下
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 65, mod = 1732073999;
int T;
ll vmax, n;
vector<int> num;
ll f[N][N];
ll qpow(int a, int b) {
ll ans = 1, base = a;
while(b) {
if(b & 1) ans = ans * base % mod;
base = base * base % mod;
b >>= 1;
}
return ans;
}
ll dfs(int pos, int cnt, bool limit, bool zero) {
if(pos < 0) return qpow(2, cnt);
if(!limit && !zero && ~f[pos][cnt]) return f[pos][cnt];
int mx = (limit ? num[pos] : 2);
ll res = 0;
for(int i = 0; i <= mx; i++)
res = (res + dfs(pos - 1, cnt + (i == 1), limit && (i == num[pos]), zero && (!i))) % mod;
if(!limit && !zero) f[pos][cnt] = res;
return res;
}
ll calc(ll x) {
num.clear();
ll tmp = x;
while(tmp) {
num.push_back(tmp % 3);
tmp /= 3;
}
return dfs(num.size() - 1, 0, 1, 1);
}
int main() {
scanf("%d%lld", &T, &vmax);
memset(f, -1, sizeof f);
while(T--) {
scanf("%lld", &n);
printf("%lld\n", calc(n));
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!