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 34-背景图片
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何利用mui实现底部选择器(含日期选择器)?
1.第一步: 项目中应该引入相应的css和js文件,相关文件可到mui官网查询. <link rel="stylesheet" type="text/css&quo ...
- 【学习总结】win7下安装Ubuntu双系统的日常
参考文献 1 - [双系统中删除linux(win7适用) ] 2 - [win7(32位)U盘安装.卸载ubuntu(64位)双系统] 3 - [Windows下安装Ubuntu 16.04双系统] ...
- spring遇到的Error applying BeanValidation relational constraints
spring3.1+hibernate4集成测试时遇到的问题: log4j:WARN No appenders could be found for logger (org.springframewo ...
- array_filter、array_walk、array_map的区别
<?php $arr=array( 1,2,3,4,5,6 ); function filter($var){ if($var%2==0) return true; } $data=array_ ...
- mysql实现首字母从A-Z排序
1.常规排序ASC DESC ASC 正序 DESC倒叙 -- 此处不用多讲 2.自定义排序 自定义排序是根据自己想要的特定字符串(数字)顺序进行排序.主要是使用函数 FIELD(str,str1,s ...
- [转帖]国产闪存颗粒终于熬出头 紫光存储S100固态硬盘评测
国产闪存颗粒终于熬出头 紫光存储S100固态硬盘评测 https://www.cnbeta.com/articles/tech/830875.htm 全国产的 SSD 群联貌似是对岸的 不过不管怎么说 ...
- 在linux上安装spark详细步骤
在linux上安装spark ,前提要部署了hadoop,并且安装了scala. 提君博客原创 对应版本 >>提君博客原创 http://www.cnblogs.com/tijun/ ...
- java内部类 和外部类的区别
java 内部类和静态内部类的区别 详细连接https://www.cnblogs.com/aademeng/articles/6192954.html 下面说一说内部类(Inner Class)和 ...
- Storm原理
zookeeper是对称结构