hiho1259 A Math Problem (数位dp)
题目链接:http://hihocoder.com/problemset/problem/1259
题目大意:g(t)=(f(i)%k=t)的f(i)的个数 求所有的(0-k-1)的g(i)的异或总值
思路:首先推出公式3*f(n)*f(2n+1)=f(2n)*(1+3f(n))
3f(n)和3f(n)+1相邻的两个数肯定是互质的 所以解出f(2n)=3*f(n) f(2n+1)=3*f(n)+1
相当于是n表示成2进制但是每位的权值为3 然后就是数位dp的过程了
dp[k][i][j] k表示在模哪一个数 i表示数位 j表示模数减掉当前剩余的
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long dp[][][];
int mod,k;
int dig[];
long long tmp[];
int solve(long long n){
int len=;
while(n>){
dig[len++]=n&;
n>>=;
}
return len;
}
void init(int len){
tmp[]=;
for(int i=;i<=len+;i++){
tmp[i]=tmp[i-]*%mod;
}
}
inline long long dfs(int pos,int val,int limit){
if(pos<) {
return val==;
}
if(!limit && dp[k][pos][val]!= -)
return dp[k][pos][val];
int end_=limit?dig[pos]:;
long long ret=;
for(int i=;i<=end_;i++){
ret+=dfs(pos-,(val-i*tmp[pos]+mod)%mod,limit&&(i==dig[pos]));
}
if(!limit) dp[k][pos][val]=ret;
return ret;
}
int main(){
int T;
scanf("%d",&T);
long long n,ans=;
memset(dp,-,sizeof(dp));
while(T--){
scanf("%lld%d",&n,&mod);
if(mod==) k=;
else if(mod==) k=;
else if(mod==) k=;
else if(mod==) k=;
else if(mod==) k=;
int len=solve(n);
init(len);
ans=;
for(int i=;i<mod;i++){
ans^=(dfs(len-,i,)-(i==));
}
printf("%lld\n",ans);
}
return ;
}
hiho1259 A Math Problem (数位dp)的更多相关文章
- hdu 5106 Bits Problem(数位dp)
题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...
- 『The Counting Problem 数位dp』
The Counting Problem Description 求 [L,R]内每个数码出现的次数. Input Format 若干行,一行两个正整数 L 和 R. 最后一行 L=R=0,表示输入结 ...
- 哈尔滨工程大学ACM预热赛 G题 A hard problem(数位dp)
链接:https://ac.nowcoder.com/acm/contest/554/G Now we have a function f(x): int f ( int x ) { if ( ...
- UVA - 1640 The Counting Problem (数位dp)
题意:统计l-r中每种数字出现的次数 很明显的数位dp问题,虽然有更简洁的做法但某人已经习惯了数位dp的风格所以还是选择扬长避短吧(说白了就是菜啊) 从高位向低位走,设状态$(u,lim,ze)$表示 ...
- nowcoder A hard problem /// 数位DP
题目大意: 称一个数x的各个数位之和为f(x) 求区间L R之间 有多少个数x%f(x)==0 #include <bits/stdc++.h> using namespace std; ...
- POJ2282:The Counting Problem(数位DP)
Description Given two integers a and b, we write the numbers between a and b, inclusive, in a list. ...
- 2018.09.28 hdu5435A serious math problem(数位dp)
传送门 数位dp卡常题. 写了一发dfs版本的发现过不了233. 于是赶紧转循环版本. 预处理出f数组. f[i][j]f[i][j]f[i][j]表示前i位数异或和为j的方案数. 然后每次直接数位d ...
- Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
Problem F. Fibonacci SystemTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...
- HDU3693 Math Teacher's Homework ---- 数位DP
HDU3693 Math Teacher's Homework 一句话题意 给定$n, k以及m_1, m_2, m_3, ..., m_n$求$x_1 \oplus x_2 \oplus x_3 \ ...
随机推荐
- H5 67-清除浮动方式三
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- c++入门之浅拷贝和深拷贝
关于这方面的知识:见一篇精辟博文:https://blog.csdn.net/feitianxuxue/article/details/9275979
- 15-分析Ajax请求并抓取今日头条街拍美图
流程框架: 抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 下载图片与保存数据库:将 ...
- eclipse、myeclipse写类时,自动生成注释
在类的上边/**+enter自动生成注释. 设置方法:Window--Prefences--Java--Code Style--Code Templates--Comments--Types--Edi ...
- 一个出色的表格(React实现__ES5语法)
本文主要是<React快速上手开发>一书中,第三章的内容代码整理,因为书中的代码零零散散,所以自己将整理了一下. 排序和编辑功能 <script> var header = [ ...
- vue组件内部引入远程js文件
之所以要做这个是因为,在一个组件内部需要引入一个js文件来定位.如果放在index.html,这样每个组件都会有这个js.所以需要在组件内单独引入. 第一种操作 Dom引入js: export def ...
- 学习笔记:filter_var()函数
PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤 filter_var() 函数通过指定的过滤器过滤变量. 如果成功,则返回已过滤的数据,如果失败,则返回 false. 语法 f ...
- 使用PHP对二维索引数组进行排序
本例中 data 数组中的每个单元表示一个表中的一行.这是典型的数据库记录的数据集合. 例子中的数据如下: volume | edition -------+-------- 67 | 2 86 | ...
- UML符号
转抄, 语言简练. 挺好. ------------------- ------------------- ------------------- ------------------- -- ...
- vscode实现vue.js项目的过程
https://blog.csdn.net/weixin_37567150/article/details/81291433 https://blog.csdn.net/ywl570717586/ar ...