[HihoCoder1259]A Math Problem
题目大意:
		  有一个函数f(n),满足3f(n)*f(2n+1)=f(2n)*(1+3f(n)),f(2n)<6f(n)。
		  我们用g(t)表示f(i)%k=t的i的个数,其中1<=i<=n。
		  问对于0<=x<k,所有的g(x)的异或和。
思路:
		  将函数用递推式表示为:
			  f(2n)=3f(n)
			  f(2n+1)=f(2n)+1
		  也就是说f(n)就是将n的二进制数串当作一个三进制数来算的值。
		  接下来就是一个简单的数位DP。
		  f[i][j]表示DP到第i位,前面那么多数所构成的三进制的值在模k意义下的值。
#include<cstdio>
#include<cctype>
#include<cstring>
typedef long long int64;
inline int64 getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int64 x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int K=;
inline int log2(const float &x) {
return ((unsigned&)x>>&)-;
}
int64 f[][K];
inline int64 calc(const int64 &n,const int &k) {
int sum=;
const int len=log2(n);
memset(f[len&],,sizeof *f);
for(register int i=len;i>=;i--) {
memset(f[!(i&)],,sizeof *f);
const int cur=n>>i&;
sum=(sum*)%k;
for(register int j=;j<cur;j++) {
f[i&][(sum+j)%k]++;
}
sum=(sum+cur)%k;
for(register int j=;j<k;j++) {
f[!(i&)][j*%k]+=f[i&][j];
f[!(i&)][(j*+)%k]+=f[i&][j];
}
}
f[][]--;
f[][sum]++;
int64 ans=;
for(register int i=;i<k;i++) {
ans^=f[][i];
}
return ans;
}
int main() {
for(register int T=getint();T;T--) {
int64 n=getint();
int k=getint();
printf("%lld\n",calc(n,k));
}
return ;
}
[HihoCoder1259]A Math Problem的更多相关文章
- hdu 1757 A Simple Math Problem (乘法矩阵)
		
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
 - HDU1757 A Simple Math Problem 矩阵快速幂
		
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
 - HDU 5615 Jam's math problem
		
Jam's math problem Problem Description Jam has a math problem. He just learned factorization.He is t ...
 - hdu----(5055)Bob and math problem(贪心)
		
Bob and math problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
 - hdu------(1757)A Simple Math Problem(简单矩阵快速幂)
		
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
 - BestCoder Round #70  Jam's math problem(hdu 5615)
		
Problem Description Jam has a math problem. He just learned factorization. He is trying to factorize ...
 - FZYZ-2071 A Simple Math Problem IX
		
P2071 -- A Simple Math Problem IX 时间限制:1000MS 内存限制:262144KB 状态:Accepted 标签: 数学问题-博弈论 ...
 - Jam's math problem(思维)
		
Jam's math problem Submit Status Practice HDU 5615 Description Jam has a math problem. He just lea ...
 - HDU 5055 Bob and math problem(结构体)
		
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5055 Problem Description Recently, Bob has been think ...
 
随机推荐
- hdu 2962 Trucking (二分+最短路Spfa)
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others ...
 - Java 将html导出word格式
			
@RequestMapping("download") public void exportWord( HttpServletRequest request, HttpServle ...
 - Centos7的iso everything与DVD以及Live的区别
			
DVD.ISO 可以用安装程序安装的所有安装包,推荐镜像 Netinstall.iso 从网络安装或者救援系统 Everything.iso 包含centos7的一套完整的软件包,可以用来安装系统或者 ...
 - Java回收方法区中回收的类
			
回收的类必须满足下面三个条件才能算是“无用的类” 1.该类所有的实例都已经被回收,也就是说Java堆中不存在该类的任何实例: 2.加载该类的ClassLoader已经被回收: 3.该类对应的java. ...
 - 【DeepLearning学习笔记】Coursera课程《Neural Networks and Deep Learning》——Week1 Introduction to deep learning课堂笔记
			
Coursera课程<Neural Networks and Deep Learning> deeplearning.ai Week1 Introduction to deep learn ...
 - ARM linux的启动部分源代码简略分析【转】
			
转自:http://www.cnblogs.com/armlinux/archive/2011/11/07/2396784.html ARM linux的启动部分源代码简略分析 以友善之臂的mini2 ...
 - linux dpm机制分析(上)【转】
			
转自:http://blog.csdn.net/lixiaojie1012/article/details/23707681 1 DPM介绍 1.1 Dpm: 设备电源管理, ...
 - win10安装提示“我们无法创建新的分区”
			
今日于笔记本安装win10时突然出现提示:我们无法创建新的分区.网上搜了不少建议,尝试了都无果. 由于我的笔记本是固态硬盘与机械硬盘混合,所以情况可能更加特殊. 最后成功的方法是: 1. 先将Win1 ...
 - leetcode 之Partition List(16)
			
思路就是定义两个链表,一个放大的,一个放小的,最后将两个连起来,注意细节问题. ListNode *partionList(ListNode *head, int value) { ListNode ...
 - jenkins构建触发器定时任务Build periodically和Poll SCM【转载】
			
转至博客:上海-悠悠 前言 跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行. 一.定时构建语法 * * * * * ( ...