文章分类 - Chapter 2. Mathematics
摘要:单变元模线性方程模板。View Code 1 #include<cstdio> 2 #include<iostream> 3 #include<string> 4 #include<cstring> 5 #include<cstdlib> 6 #include<iomanip> 7 #include<map> 8 #include<set> 9 #include<vector>10 #include<algorithm>11 #include<cmath>12 u
阅读全文
摘要:条件概率。数据量太小了, 暴力吧!View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<stack> 9 #include<map>10 #include<set>11 #include<string>1
阅读全文
摘要:54s的时限暴力吧!View Code 1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 const int maxn = 45000; 8 int prime[maxn], plen = 0; 9 bool vis[maxn];10 void mklist() {11 memset(vis, 0, sizeof(vis));12 plen = 0;13 for(int i = 2; i
阅读全文
摘要:根据1的个数划分状态, 根据必胜态后必有一个必败态进行转移。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 6 const int maxn = 100; 7 int dp[maxn][55000]; 8 9 int DP(int a, int b) {10 if(dp[a][b] != -1) return dp[a][b];11 if(b == 1) return dp[a][b] = DP(a + 1, 0);1
阅读全文
摘要:困扰了很久, 偶尔看到了公式, 记下。Expanding the generating function shows that the number of convex polyominoes having perimeter is given bywhere , , and is a binomial coefficient。公式来源于这里: http://mathworld.wolfram.com/ConvexPolyomino.htmlView Code 1 import java.math.BigInteger; 2 import java.util.Scanner; 3 4 ...
阅读全文
摘要:如果N堆石子全是1, 那么就要根据N的奇偶性来判断先手的输赢。如果有一堆大于1, 假设先手全部拿走这一堆之后是必败态, 那么他拿走全部, 如果是必胜态, 那么他大可以让这一堆剩最后一个, 让后手来拿, 这样他就必胜了,所以, 只要有一堆大于1, 那么先手必胜。View Code 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int main() { 6 int T; 7 cin >> T; 8 while(T--) { 9 int n;10 cin...
阅读全文
摘要:和书上的例题是一样的。View Code 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 typedef long long ll; 6 7 ll solve(ll n) { 8 return (n & 1) ? solve(n / 2) : n / 2; 9 }10 int main() {11 ll n;12 while(cin >> n && n) {13 if(solve(n)) cout << "Alice"
阅读全文
摘要:按照N的小于1000000的因子枚举就是了;View Code 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 8 const int maxn = 1000000 + 10; 9 10 typedef long long ll;11 ll prime[maxn], plen;12 bool vis[maxn];13 14 void
阅读全文
摘要:这个题目我在poj上交过了, uva 和 uvalive上始终交不过, 貌似至今还没有从uva和uvalive上交过得呢。最难猜的数就是1了,由于答案可能是质数, 所以猜一个质数,就把他的倍数全都删掉,那么就把[1,n]中的质数分成最少的组,使得每组的乘积不超过n;剩下的就是贪心了;View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 6 const int maxn = 10000 + 10; 7 int n, plen,
阅读全文
摘要:1)当3k + 7不是质数时, 那么他的因子都在(3k + 6)!里面, 所以 (3k + 6)! % (3k + 7) == 0;所以 (3k + 6)! / (3K + 7) == ((3k + 6)! + 1) / (3k + 7),即: Sn = 0;2)当3k + 7是质数时, 由威尔逊定理知: (3k + 6)! = -1 mod (3k+7); 所以(3k + 6)! + 1刚好是 (3k + 7)的倍数, 即:(3k + 6)! / (3k + 7) 比 ((3k + 6)! + 1) / (3k + 7) 少1;故,题目实际是求3 * n + 7 内有多少个形如 3k...
阅读全文
摘要:假设k / i 与 k / (i + 1)的值相同, 那么 k / i = k / (i + 1) = q, 则:k % i = k - q * i = p, k % (i + 1) = k - k - q * i - q = p - q;即: 对于同一个商来说, 余数组成一个递减的等差数列, 公差就是 k / i;View Code 1 #include<cstdio> 2 #include<iostream> 3 #include<string> 4 #include<cstring> 5 #include<cstdlib> 6
阅读全文
摘要:假如只用一个数字的话, 如: a, aaa, aaaa, ...由鸽巢原理, 必存在一个连续的区间, 他们的和是n的倍数, 证明如下: 我们考虑n个前n项和,s1, s2, s3...., 如果当中有某个数可被n整除,则结论成立,否则考虑每一个除以n的余数, 余数等于1, 2, 3...n - 1. 有n - 1个余数, 确有n个和, 必定有两个前n项和同余, 设这两个同余的数为bn + r, cn + r, 则两式相减,得(b - c)n, 是的整数倍,结论成立。因此最后的结果必定要么就包含一个数字, 要么包含两个数字, 接下来就是解决这问题的利器BFS了。View Code 1 #i...
阅读全文
摘要:1)当a != 0 && b != 0 时,只有在 a^2 + 2 * b^2是素数的情况下a + b * sqrt(-2)才是高斯素数;2)当a == 0时,a + b * sqrt(-2) 不是高斯素数;3)b不会是0, 题目中有限制;以上结论来自这里: http://mathworld.wolfram.com/GaussianPrime.html根据以上结论程序很好写了, 就是判断素数;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #inclu
阅读全文
摘要:题目要求a0^a1^a2^a3^a4..., 我们先来考虑(a^p)%m: 1)如果a与m互质, 则a属于Z*m, 则由a生成的群是Z*m的子群, 设a的阶为T, Z*m的大小为S,由Lagrange定理知,T | S;T是a的生成群的循环节, 可知S也是a的生成群的循环节,所以有: (a^p) % m == (a^(p % phi(m))) % m; 2)如果a与m不互质,那我们要把他们转化为互质的情形,由余数的定义有: (a^p) % m = a^p - x * m = c 要使a和m互质, 必须把m中a的因子除干净, 假设这些因子的乘积为k, m除完因子之后的值为m',则...
阅读全文
摘要:由于N的所有因子之和为S, N本身是自己的因子, 所以N不会大于S, S的值小于1000, 直接暴力即可。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 6 const int maxn = 2000; 7 int prim[maxn], plen; 8 bool vis[maxn]; 9 void mklist()10 {11 memset(vis, 0, sizeof(vis));12 for(int i = 2;
阅读全文
摘要:因为缺少的士兵是两个正方形, 我们设 N = 2 * n^2,表示缺失的人数,r表示宽度, 根据题意则有 S + N = (3r + 2n) * (2r + n) -> S + N = 6r^2 + 7rn + 2n^2 -> S = 6r^2 + 7rn = r(6r + 7n)所以r整除S, 可以枚举S的约数, 来求出n。由于最后要求按原来的值从大到小排序, 我们可以发现r越大,n就会越小, 所以只要按照r递增的顺序计算的话最后的答案就是从大到小按原值排的序, 再注意余数判重就是了。View Code 1 #include<cstdio> 2 #include<
阅读全文
摘要:题目中给的点都是0.1的倍数, 要求两个点之间整数点的个数, 一个很自然的想法是把坐标都乘以10, 然后找第一个整十倍点(x1,y1)和最后一个整十倍点(x2,y2), 那么答案就是: gcd(abs(x1 / 10 - x2 / 10), abs(y1 / 10 - y2 / 10)) + 1;但是怎么找10倍点的个数呢, 按照x增1的方式枚举肯定不行,因为我试过了, 超时的, 因为整点之间的距离总是相等的, 可以按照相邻两个整点之间的位置向量开始枚举, 实验证明速度还不错。View Code 1 #include<iostream> 2 #include<cstdio&g
阅读全文
摘要:基础的二元一次不定方程, 直接扩展gcd.View Code 1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 using namespace std; 5 6 typedef long long ll; 7 8 void gcd(ll a, ll b, ll& d, ll& x, ll&y) 9 {10 if(!b)11 {12 d = a; x = 1; y = 0;13 }14 else15 {16 gcd(b, a % b, d, y, x...
阅读全文

浙公网安备 33010602011771号