摘要: 很有意思的一个数论题。是这样的,给你一个数数组a[i],其中给出的每一个数字和要求的数字方位都是[1,m],现在问你根据a[]构造一个b[],且a和b中间的不相等的元素的个数恰好有k个。现在问你gcd(b[])分别为1,2,……,m的个数分别有多少种可能情况。额。。。是这样来考虑的。——————容斥原理。有点像素数筛选,但是复杂一点。对于个数我们需要从大到小来求解(这里的缘由自己想象就知道了)假设当前我需要求解有多少个情况满足gcd(b[])=x,那么显然b中的所有的数都必须是x的倍数。首先我们可以直接统计出来在a中有多少个数不是x的倍数,那么显然这些数是一定要被更改掉的。如果非x倍数个数大于 阅读全文
posted @ 2013-11-28 00:12 092000 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 题目的意思是给你一些数字a[i](首位相连),现在要你选出一些连续的数字连续的每一位单独地作为一个数位。现在问你有多少种选择的方式使得选出的数字为k的一个倍数。其实题目是很简单的。由于k不大(200),总共的数字个数为50000,所以我们对于当前走到的每一个数字最多的状态数目也只有50000*200个。同时由于是循环的,我们可以使长度增倍,这样就可以保证序列是循环的了。不过注意,增倍后空间是开不下的,所以需要使用循环的滚动数组。同时注意递推的细节,还有有的a[i]不止一位数,不能直接取模。#include #include #include #define maxn 50050typedef 阅读全文
posted @ 2013-11-28 00:05 092000 阅读(305) 评论(0) 推荐(0) 编辑