HDU 4321 Arcane Numbers 2
2024-08-27 19:59:31
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4321
-------------------------------------------------------------------------------
虽然有更优美的做法 不过数据范围还是可以数位$DP$的
即把模型转化为 在区间内 $mod\ a = b\ mod\ a$ 的数所含$1$的个数之和
四维的数组分别记录 枚举到第$x$位 是否达到上限 $mod\ a$ 的余数 当前位是否为$1$ 这些状态
然后统计在这些状态下的数的个数$F$ 以及在这些状态下的数的总贡献 $G$
转移的话 $F$比较简单
$G$的话先把当前位之后的$G$全部转移上去 再把当前位根据$F$的大小算好贡献
之后就是一个记忆化搜索了
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
long long f[][][][], g[][][][], two[];
int ti[][][][];
bool num[];
long long a, b, n, ans;
int t, len, tt;
void work(long long x)
{
memset(num, , sizeof num);
len = ;
while(x)
{
num[++len] = x & ;
x >>= ;
}
two[] = % a;
for(int i = ; i < len; ++i)
two[i] = two[i - ] * % a;
}
long long dfs(int x, bool top, int r, bool one)
{
if(ti[x][top][r][one] == tt)
return f[x][top][r][one];
ti[x][top][r][one] = tt;
if(x == )
{
g[x][top][r][one] = (one && (r == b % a));
return f[x][top][r][one] = (r == b % a);
}
f[x][top][r][one] = g[x][top][r][one] = ;
if(top)
{
if(num[x])
{
f[x][top][r][one] += dfs(x - , , (two[x - ] + r) % a, );
g[x][top][r][one] += g[x - ][][(two[x - ] + r) % a][];
f[x][top][r][one] += dfs(x - , , r, );
g[x][top][r][one] += g[x - ][][r][];
}
else
{
f[x][top][r][one] += dfs(x - , , r, );
g[x][top][r][one] += g[x - ][][r][];
}
}
else
{
f[x][top][r][one] += dfs(x - , , (two[x - ] + r) % a, );
g[x][top][r][one] += g[x - ][][(two[x - ] + r) % a][];
f[x][top][r][one] += dfs(x - , , r, );
g[x][top][r][one] += g[x - ][][r][];
}
g[x][top][r][one] += one * f[x][top][r][one];
return f[x][top][r][one];
}
int main()
{
scanf("%d", &t);
for(int ca = ; ca <= t; ++ca)
{
scanf("%lld%lld%lld", &a, &b, &n);
work(b);
++tt;
dfs(len + , , , );
ans = -g[len + ][][][];
work(b + n * a);
++tt;
dfs(len + , , , );
ans += g[len + ][][][];
printf("Case #%d: %lld\n", ca, ans);
}
return ;
}
最新文章
- C# socket send方法
- highcharts
- PyQt写的五子棋
- Understanding, Operating and Monitoring Apache Kafka
- 产品Backlog
- Android的ADT内容助手快捷方式设置
- 关于 ArtifactTransferException: Failure to transfer
- html中#include file的使用方法
- Jquery Mobile下设置radio控件选中
- JQUERY1.9学习笔记 之基本过滤器(六) 页眉选择器
- 【Trie】【HDU1247】【Hat’s Wordsfd2】
- 调色板QPalette类用法详解(附实例、源码)(很清楚:窗口背景色 前景色 按钮的颜色 按钮文本的颜色 )
- Javascript 中的非空判断 undefined,null, NaN的区别
- 工作中对数组的一些处理,整理(结合underscore.js)
- [S]SQL SERVER数据库维护与重建索引
- 有了Openvswitch和Docker,终于可以做《TCP/IP详解》的实验了!
- js打印小结
- 博主新建Linux学习交流群,欢迎广大大神入驻~
- (二)通过fork编写一个简单的并发服务器
- JSTL 和 EL