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 \ ...
随机推荐
- jdk下载及环境变量配置
一.下载 下载链接 二.环境变量:
- java从request中获取GET和POST请求参数
URL和参数列表 一 获取请求方式 request.getMethod(); get和post都可用, 二 获取请求类型 request.getContentType(); get和post都可用,示 ...
- CLOUD不审核修改物料
- Codeforces 1154G Minimum Possible LCM
题目链接:http://codeforces.com/problemset/problem/1154/G 题目大意: 给定n个数,在这些数中选2个数,使这两个数的最小公倍数最小,输出这两个数的下标(如 ...
- ubunto启动chrome报错
/usr/bin/google-chrome-stable[5199:5199:0703/143543.136117:ERROR:zygote_host_impl_linux.cc(88)] Runn ...
- Saltstack 安装与常用模块
一.介绍 saltstack是基于C/S服务模式,在该架构中,服务器端叫做Master,客户端叫做Minion.传统的C/S模式我们这样理解,客户端发送请求给服务器端,服务器端接受到来自客户端的请求并 ...
- wiki 安装
地址:https://www.jianshu.com/p/fb2574567eae
- 手把手制作一个简单的IDEA插件(环境搭建Demo篇)
新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...
- pooling的几种形式(转)
转载地址:http://blog.csdn.net/malefactor/article/details/51078135 原作者:张俊林 CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见 ...
- powerdesigner 16.5 不允许有扩展属性,或对象不存在
创建完之后这边会出现 选择刚创建的用户 这样就可以了