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 \ ...
随机推荐
- Python_练习题_49
# 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao','nezha'] def func(item): re ...
- Is-a
在知识表示.面向对象程序设计与面向对象设计的领域里, is-a(英语:subsumption,包含架构)指的是类的父子继承关系, 例如类D是另一个类B的子类(类B是类D的父类). 换句话说,通常&qu ...
- 【学习总结】Git学习-参考廖雪峰老师教程一-Git简介
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- Docker防主机意外断电导致容器实例无法驱动解决方案:UPS || write barrier || 上btrfs定期snapshot
Write barrier - Wikipediahttps://en.wikipedia.org/wiki/Write_barrier R大在在介绍CMS时提到了write barrier写屏蔽的概 ...
- Linux基础命令和NAT技术
yum yellowdog updater,modified是一种用python写的基于rpm的管理工具 用于解决rpm包的依赖性 要安装编译工具 yum install gcc 库函数:静态库 ...
- 【Python3练习题 013】 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字
a=input('输入数字>>>') count=int(input('几个数字相加>>>')) ret=[] for i in range(1,count+1): ...
- Yii的操作提示框
效果如图 HTML + CSS<style> div.error{ background: #FFE0E0; border: 2px solid #FFA0A0; padding: 10p ...
- Bootstrap知识记录:排版样式
---恢复内容开始--- 一.页面排版Bootstrap 提供了一些常规设计好的页面排版的样式供开发者使用.1.页面主体Bootstrap 将全局font-size 设置为14px,line-heig ...
- Sqlserver tablediff的简单使用
1. 先列举一下自己简单的比较语句 tablediff -sourceserver 10.24.160.73 -sourcedatabase cwbasemi70 -sourceschema lcmi ...
- spring IOC源码分析(ApplicationContext)
在上一篇文章中,我们以BeanFactory这条主线进行IOC的源码解析的,这里,将以ApplicationContext这条线进行分析.先看使用方法: @Test public void testA ...