随笔分类 - 数论
摘要:这个题是根据某个二维平面的题改编过来的。首先把问题转化一下, 就是你站在原点(0, 0, 0)能看到多少格点。答案分为三个部分:八个象限里的格点,即 gcd(x, y, z) = 1,且xyz均不为0. 可以先假设xyz都是整数,然后将所求的答案乘812个四分之一平面中的点,可以先算(x, y, 0...
阅读全文
摘要:首先有个关键性的结论就是一个数的合数幂就是超级幂。最小的合数是4,所以枚举底数的上限是pow(2^64, 1/4) = 2^16 = 65536对于底数base,指数的上限就是ceil(64*log(2)/log(base)),注意这个上限不能取到,是个开区间 1 #include 2 #incl...
阅读全文
摘要:我一直相信这道题有十分巧妙的解法的,去搜了好多题解发现有的太过玄妙不能领会。最简单的就是枚举n的所有约数,然后二重循环找lcm(a, b) = n的个数 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int gcd(i...
阅读全文
摘要:求mk整除n!,求k的最大值。现将m分解质因数,比如对于素数p1分解出来的指数为k1,那么n!中能分解出多少个p1出来呢?考虑10!中2的个数c:1~10中有10/2个数是2的倍数,c += 5;1~10中有10/4个数是4的倍数,所以c += 2,其中有10/8 = 1个数是8的倍数,所以c +=...
阅读全文
摘要:因为题目要求同列相邻两格不同色,所以列与列之间不影响,可以逐列染色。如果一个格子的上面相邻的格子,已经被染色则染这个格子的时候,共有k-1中选择。反过来,如果一个格子位于第一列,或者上面相邻的格子是不能被染色的格子,则共有k中选择。虽然,矩阵的行数不定,但至少为所有不能被染色格子行标的最大值m。分别...
阅读全文
摘要:如果直接枚举的话,枚举量为k1 * k2 *...* kc根据枚举量的不同,有两种解法。枚举量不是太大的话,比如不超过1e4,可以枚举每个集合中的余数Yi,然后用中国剩余定理求解。解的个数不够S个的时候,要把这些解分别加上M、2M...(M = X1 * X2 *...* Xc)如果上述枚举量太大的...
阅读全文
摘要:题意:求sum{gcd(i, j) | 1 ≤ i 2 typedef long long LL; 3 4 const int maxn = 4000000; 5 6 int phi[maxn + 10]; 7 LL f[maxn + 10]; 8 9 void phi_table()10 ...
阅读全文
摘要:A. Pangram题意:判断字符串中26种字母是否全都出现过,不区分大小写。题本身不难,可是忘了用getchar()吞掉输入第一行最末的换行符,导致被某些别有用心的人在比赛快结束的时候Hack了。 1 #include 2 using namespace std; 3 4 const int ...
阅读全文
摘要:发现自己搜索真的很弱,也许做题太少了吧。代码大部分是参考别人的,=_=||题意:给出一个phi(n),求最小的n分析:回顾一下欧拉函数的公式:,注意这里的Pi是互不相同的素数,所以后面搜索的时候要进行标记。先找出所有的素数p,满足(p - 1)整除题目中所给的phi(n)然后暴搜。。素数打表打到1e...
阅读全文
摘要:题意:你现在来到了一个所有的数都模4余1的世界,也就是除了这种数没有其他的数了。然而素数的定义依然没变,如果一个数不能写成两个非1数字的乘积,则它是素数。比如,在这里5就变成了最小的素数。两个素数相乘得到一个半素数,比如5×5 = 25就是最小的半素数。求1~h之间有多少个半素数。分析:虽然是要求[...
阅读全文
摘要:A. Fox And Snake代码可能有点挫,但能够快速A掉就够了。 1 #include 2 3 int main() 4 { 5 //freopen("in.txt", "r", stdin); 6 7 int n, m; 8 scanf("%d%d", &n, ...
阅读全文
摘要:题意:求区间[L, U]的正因数的个数。分析:有这样一条公式,将n分解为,则n的正因数的个数为事先打好素数表,按照上面的公式统计出最大值即可。 1 #include 2 #include 3 4 const int maxn = 31700; 5 bool vis[maxn + 10]; 6 ...
阅读全文
摘要:题意:对于32位有符号整数x,将其写成x = bp的形式,求p可能的最大值。分析:将x分解质因数,然后求所有指数的gcd即可。对于负数还要再处理一下,负数求得的p必须是奇数才行。 1 #include 2 #include 3 4 const int maxn = 46500; 5 bool ...
阅读全文
摘要:题意:求正整数L和U之间有多少个整数x满足形如x=pk 这种形式,其中p为素数,k>1分析:首先筛出1e6内的素数,枚举每个素数求出1e12内所有满足条件的数,然后排序。对于L和U,二分查找出小于U和L的最大数的下标,作差即可得到答案。 1 #include 2 #include 3 #incl...
阅读全文
摘要:题意:给出n,求把n写成若干个连续素数之和的方案数。分析:这道题非常类似大白书P48的例21,上面详细讲了如何从一个O(n3)的算法优化到O(n2)再到O(nlogn),最后到O(n)的神一般的优化。首先筛出10000以内的素数,放到一个数组中,然后求出素数的前缀和B。这样第i个素数一直累加到第j个...
阅读全文
摘要:题意:给出一个整数n,如果n是素数输出0,否则输出它后一个素数与前一个素数的差值。分析:首先用筛法把前十万个素数都筛出来,然后放到数组里。用二分找到不大于n的最大的素数的下标,如果这个素数等于n,则直接输出0,否则输出它后一个素数与它本身的差值。 1 #include 2 #include 3 ...
阅读全文
摘要:题意:给出一个数列,求一个连续的子序列,使得MGCD(i, j) = 该子序列的长度(j-i+1) × 子序列的gcd 最大,并输出这个最大值。分析:感觉可能要用优先队列,但貌似也用不上。但类似地,从左往右枚举右端点,不难发现随着序列长度的增大,其子序列的最大公约数是非递增的。一般情况下,是呈阶梯状...
阅读全文
摘要:题意:这道题和POJ 3090很相似,求|x|≤a,|y|≤b 中站在原点可见的整点的个数K,所有的整点个数为N(除去原点),求K/N分析:坐标轴上有四个可见的点,因为每个象限可见的点数都是一样的,所以我们只要求出第一象限可见的点数然后×4+4,即是K。可见的点满足gcd(x, y) = 1,于是将...
阅读全文
摘要:题意:给出N和M,统计区间x ∈ [2, N!],x满足所有素因子都大于M的x的个数。分析:首先将问题转化一下,所有素因子都大于M 等价于 这个数与M!互素对于k大于M!,k与M!互素等价于 k % M! 与 M!互素所以我们可以求出φ(M!)(φ为欧拉函数) 然后乘以N! / M!,最后答案再减一...
阅读全文
摘要:题意:给出n, k,求分析:假设,则k mod (i+1) = k - (i+1)*p = k - i*p - p = k mod i - p则对于某个区间,i∈[l, r],k/i的整数部分p相同,则其余数成等差数列,公差为-p然后我想到了做莫比乌斯反演时候有个分块加速,在区间[i, n / (n...
阅读全文