
数论
f_zyj
一个追逐蝴蝶的人!
展开
-
自适应simpson积分
ACM模版自适应simpson积分const double eps = 1e-6; // 积分精度// 被积函数double F(double x){ double ans; // 被积函数 // ...// ans = x * exp(x); // 椭圆为例 return ans;}// 三点simpson法,这里要求F是原创 2016-07-09 22:04:49 · 2127 阅读 · 0 评论 -
多项式求根
ACM模版多项式求根(牛顿法)/* * 牛顿法解多项式的根 * 输入:多项式系数c[],多项式度数n,求在[a,b]间的根 * 输出:根 要求保证[a,b]间有根 */double fabs(double x){ return (x < 0) ? -x : x;}double f(int m, double c[], double x){ int i;原创 2016-07-10 01:31:11 · 6584 阅读 · 0 评论 -
Polya计数
ACM模版Polya计数/* * c种颜色的珠子,组成长为s的项链,项链没有方向和起始位置 */int gcd(int a, int b){ return b ? gcd(b, a % b) : a;}int main(int argc, const char * argv[]){ int c, s; while (cin >> c >> s) {原创 2016-07-10 17:14:51 · 1919 阅读 · 0 评论 -
最大1矩阵
ACM模版最大1矩阵const int N = 1000;bool a[N][N];int Run(const int &m, const int &n) // a[1...m][1...n]{ // O(m*n) int i, j, k, l, r, max=0; int col[N];原创 2016-07-10 19:50:21 · 1700 阅读 · 0 评论 -
汉诺塔
ACM模版汉诺塔1,2,…,n表示n个盘子.数字大盘子就大. n个盘子放在第1根柱子上.大盘不能放在小盘上. 在第1根柱子上的盘子是a[1],a[2],…,a[n].a[1]=n,a[2]=n-1,…,a[n]=1. 即a[1]是最下面的盘子.把n个盘子移动到第3根柱子. 每次只能移动1个盘子,且大盘不能放在小盘上.问第m次移动的是哪一个盘子,从哪根柱子移到哪根柱子. 例如:n=3,m=2原创 2016-07-23 00:40:05 · 1717 阅读 · 0 评论 -
POJ-2689-Prime Distance
ACM模版题目链接POJ 2689 Prime Distance题解素数排查问题,问题的关键在于如何找出给定区间中的所有素数,涉及到一个预处理。代码#include <iostream>using namespace std;const int MAXN = 100010;int prime[MAXN + 1];// 预处理void getPrime(){ memset(prime,原创 2016-06-30 23:18:16 · 847 阅读 · 0 评论 -
高斯消元
ACM模版高斯消元/* * 高斯消元(浮点数) */#define eps 1e-9const int MAXN = 220;double a[MAXN][MAXN]; // 方程的左边的矩阵double x[MAXN]; // 等式右边的值,求解后x存的就是结果int equ, var; // 方程数和未知数个数// 返回0无解,返回1原创 2016-07-04 03:22:26 · 617 阅读 · 0 评论 -
51Nod-1136-欧拉函数
ACM模版描述对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler’s totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质。Input 输入一个数N。(2 <= N <= 10^9)Output 输出Phi(n)。Input示例 8Output示例 4题解因原创 2016-07-26 13:32:51 · 439 阅读 · 0 评论 -
51Nod-1181-质数中的质数(质数筛法)
ACM模版描述如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。Input 输入一个数N(N <= 10^6)Output 输出>=N的最小的质数中的质数。Input示例 20Output示例 31题解根据题上提示,这里需要用到质数的原创 2016-07-26 18:10:54 · 2320 阅读 · 4 评论 -
51Nod-1185-威佐夫游戏 V2
ACM模版描述有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。 例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。Input 第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <=原创 2016-07-27 00:04:58 · 1303 阅读 · 0 评论 -
大数非四则相关
ACM模版大数平方根(字符串数组表示)void Sqrt(char *str){ double i, r, n; int j, l, size, num, x[1000]; size = (int)strlen(str); if (size == 1 && str[0] == '0') { cout << "0\n"; ret原创 2016-07-10 22:38:23 · 826 阅读 · 0 评论 -
FFT
ACM模版FFTconst double PI = acos(-1.0);// 复数结构体struct Complex{ double x, y; // 实部和虚部 x + yi Complex(double _x = 0.0, double _y = 0.0) { x = _x; y = _y; } Comple原创 2016-07-05 17:04:21 · 5680 阅读 · 2 评论 -
HDU-1402-A*B Problem Plus
ACM模版题目链接A*B Problem Plus题解高精度乘法,使用FFT可以快速解决。代码#include <iostream>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;// FFT/* * HDU 1402 求高精度乘法 * A *原创 2016-07-05 01:06:27 · 1458 阅读 · 0 评论 -
HDU-4609-3-idiots
ACM模版题目链接HDU 4609 3-idiots题解给出n条线段长度,任取三根,组成三角形的概率。 使用FFT求可以组成三角形的取法有几种。代码#include <iostream>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;/* * 给出原创 2016-07-05 17:00:26 · 722 阅读 · 0 评论 -
51Nod-1240-莫比乌斯函数
ACM模版描述莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。(据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数)。 具体定义如下: 如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。 如果一个数不包含平方因子,并且有k个不同的质因子,那原创 2016-07-28 03:30:35 · 1788 阅读 · 0 评论 -
莫比乌斯反演
ACM模版莫比乌斯反演莫比乌斯反演公式则 莫比乌斯函数µ 另一种更常用的形式: 在某一个范围内: 则 代码/* * 莫比乌斯反演公式 * 线性筛法求解积性函数(莫比乌斯函数) */const int MAXN = 1000000;bool check[MAXN + 10];int prime[MAXN + 10];int mu[MAXN + 10];void Mo原创 2016-07-07 16:58:07 · 3573 阅读 · 1 评论 -
POJ-1681-Painter's Problem
ACM模版题目链接POJ 1681 Painter’s Problem题解高斯消元法求方程组的解,枚举自动变元,解中1个数最少的。代码#include <iostream>#include <cmath>using namespace std;// 高斯消元法求方程组的解/* * 一类开关问题,对2取模的01方程组 * 需要枚举自动变元,找解中1个数最少的 */// 对2取模的01方原创 2016-07-06 23:18:42 · 931 阅读 · 0 评论 -
A^B约数之和
ACM模版A^B约数之和对MOD取模参考:《合数相关》/* * 求A^B的约数之和对MOD取模 * 需要素数筛选和合数分解的算法,需要先调用getPrime(); * 参考《合数相关》 * 1+p+p^2+p^3+...+p^n */const int MOD = 1000000;long long pow_m(long long a, long long n){ lo原创 2016-07-07 15:16:58 · 1539 阅读 · 0 评论 -
BZOJ-2301-[HAOI2011]Problem b
ACM模版[HAOI2011]Problem b描述对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。Input 第一行一个整数n,接下来n行每行五个整数,分别表示a、b、c、d、kOutput 共n行,每行一个整数表示满足要求的数对(x,y)的个数Sample Input 2 2 5 1 5原创 2016-07-07 19:24:01 · 1331 阅读 · 0 评论 -
斐波那契数列
ACM模版矩阵原理单独求解/* * 求斐波那契数列第N项,模MOD */#define mod(a, m) ((a) % (m) + (m)) % (m)const int MOD = 1e9 + 9;struct MATRIX{ long long a[2][2];};MATRIX a;long long f[2];void ANS_Cf(MATRIX a){ f[原创 2016-07-29 00:02:28 · 1818 阅读 · 0 评论 -
51Nod-1242-斐波那契数列的第N项
ACM模版描述斐波那契数列的定义如下:F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2)(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, …) 给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。Input 输入1个数n(1 <= n <= 10^原创 2016-07-28 23:59:14 · 1072 阅读 · 0 评论 -
51Nod-1256-乘法逆元
ACM模版描述给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。Input 输入2个数M, N中间用空格分隔(1 <= M < N <= 10^9)Output 输出一个数K,满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。Input示例 2 3Output示例原创 2016-07-29 01:34:19 · 1618 阅读 · 0 评论 -
Baby-Step Giant-Step
ACM模版Baby-Step Giant-Step/* * baby_step giant _step * a^x = b(mod n) n不要求是素数 * 求解上式0 ≤ x < n的解 */#define MOD 76543int hs[MOD];int head[MOD];int _next[MOD];int id[MOD];int top;void insert(i原创 2016-07-09 17:17:13 · 1325 阅读 · 0 评论 -
51Nod-1384-全排列
ACM模版描述给出一个字符串S(可能又重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”, 输出为:1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211Input 输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)Output 输出S所包含的字符原创 2016-07-29 21:40:27 · 1152 阅读 · 0 评论 -
排列组合
ACM模版排列类循环排列用递归实现多重循环,本递归程序相当于n重循环,每重循环的长度为m的情况,所以输出共有m^n行。/* * 输入样例: 3 2 * 输出样例: * 0 0 0 * 0 0 1 * 0 1 0 * 0 1 1 * 1 0 0 * 1 0 1 * 1 1 0 * 1 1 1 */#define MAX_N 10int n, m;原创 2016-07-11 21:38:24 · 2680 阅读 · 0 评论 -
51Nod-1080-两个数的平方和
ACM模版描述题解注意查找的范围即可(设置一个标志范围的哨兵),一道水题,无需多言。代码#include <iostream>#include <cmath>using namespace std;int main(int argc, const char * argv[]){ int N; while (cin >> N) { int A;原创 2016-07-30 15:05:59 · 840 阅读 · 0 评论 -
51Nod-1082-与7无关的数
ACM模版描述题解这道题如果暴力解题,超时是一定的,所以需要用到打表来解决。这里需要注意的是数据溢出问题,开始时因为忽略了这个问题,i * i时发生了数据溢出,所以导致大数据测试数据系数WA,找了好久才找到问题所在,于是将i定义为long long后成功AC了。代码#include <iostream>#include <cstring>#include <cstdio>using namesp原创 2016-07-30 16:28:13 · 2800 阅读 · 2 评论 -
51Nod-1126-求递推序列的第N项
ACM模版描述题解根据题意可知,一定存在循环节,只需要找到循环节即可。判断是否为循环节的方法是当连着两项为1时,即找到了循环节。代码#include <iostream>using namespace std;int f[300] = {1, 1, 1}; // 根据规律可知,一定存在循环节int main(int argc, const char * argv[]){ int A,原创 2016-08-03 15:44:26 · 1814 阅读 · 8 评论 -
51Nod-1087-1 10 100 1000
ACM模版描述题解找规律,查找数列中1的通式。 (0+1+2+…n)+1==N (o+n)*(n+1)/2+1==N n*(n+1)==(N-1)*2 (N-1)*2=m*m n代码#include <iostream>#include <cstdio>#include <cmath>using namespace std;int main(int argc, co原创 2016-07-30 21:51:37 · 989 阅读 · 2 评论 -
51Nod-1138-连续整数的和
ACM模版描述题解利用等差数列公式推导即可,设首项为i,项数为j,则可得到(2N-j*j+j)/(2*j)=i, 这里枚举项数j即可,因为项数j最多可以为sqrt(2N),故A之…… 另外强调的是,注意输出的格式,因为我一开始输出的是i没有格式化,所以WA了一半数据。代码#include <iostream>#include <cmath>typedef long long ll;using原创 2016-08-03 18:39:23 · 367 阅读 · 0 评论 -
51Nod-1010-只包含2 3 5的数
ACM模版描述题解先打表生成丑数,然后二分查找到大于等于n的第一个数。代码#include <iostream>#include <cstdio>#include <queue>using namespace std;typedef unsigned long long ull;const int MAXN = 1e4 + 1e3;/* * Ugly Numbers * Ugly numbe原创 2016-07-31 10:06:05 · 618 阅读 · 0 评论 -
51Nod-1024-矩阵中不重复的元素
ACM模版描述题解由于是指数级别的对比,所以取对数是一个很好地解决办法。然后悉数插入set,直接输出set的size()即可。代码#include <iostream>#include <cmath>#include <set>using namespace std;set<double> S;int main(int argc, const char * argv[]){ int m原创 2016-07-31 14:39:39 · 509 阅读 · 0 评论 -
51Nod-1417-天堂里的游戏
ACM模版描述 题解一般性博弈论都是找规律,根据样例解释,我们可以推出以下公式(结果为n/m): An-C(m-n) = B(m-n)-Cn m = A+B+2C n = B+C 这里格外需要注意的是,要防止数据溢出问题的发生,并且需要GCD一下。代码#include <iostream>#include <cstdio>using namespace std;long long gcd(l原创 2016-08-04 03:15:52 · 871 阅读 · 0 评论 -
51Nod-1031-骨牌覆盖
ACM模版描述题解可以考虑为两种情况,一种是竖着放一个,则前边的位置有F[n - 1]种,另一种是横着放两个,则前边的位置有F[n - 2]种,由此可以发现这里的F[n]符合斐波那契数列,所以F[n] = F[n - 1] + F[n - 2]。代码#include <iostream>using namespace std;const int MOD = 1e9 + 7;const int MA原创 2016-07-31 15:53:35 · 730 阅读 · 0 评论 -
星期问题
ACM模版星期问题基姆拉尔森公式: W = (D + 2 * M + 3 * (M + 1) \ 5 + Y + Y \ 4 - Y \ 100 + Y \ 400) Mod 7基姆拉尔森公式的计算结果是0,1,2,3,4,5,6 七种可能; 结果的对应关系: 0:星期一 1:星期二 2:星期三 3:星期四 4:星期五 5:星期六 6:星期日/* * 已知1752年9月3日原创 2016-07-22 02:02:26 · 1769 阅读 · 0 评论 -
51Nod-1639-绑鞋带
ACM模版描述题解组合数学,找出递推式即可。 考虑n根鞋带时的第一个操作,只要不选择同一根鞋带即可,变相等价于n-1根时的情况。这样,我们可以递推求解。 假设已经有i-1根鞋带组成一个环,用ans[i-1]表示其概率,那么将第i根鞋带插入前边的i-1根鞋带的方案数为2*(i-1),这里乘以2是因为鞋带两头都可以插入,那么所有的情况(插成环的情况+不插成环的情况)为2*(i-1)+1,那么公式即为原创 2016-08-16 20:25:56 · 372 阅读 · 0 评论 -
反素数
ACM模版求最小的因子个数为n个正整数typedef unsigned long long ULL;const ULL INF = ~0ULL;const int MAXP = 16;int prime[MAXP] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};int n;ULL ans;void dfs(int d原创 2016-08-17 01:27:04 · 1695 阅读 · 8 评论 -
51Nod-1060-最复杂的数
ACM模版描述题解百度百科: 对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0代码#include <iostream>typedef long long ll;using namespace std;const int MAXP = 16;const int prime[MAXP] = {2, 3, 5, 7, 11, 13,原创 2016-08-17 01:35:17 · 1840 阅读 · 6 评论 -
51Nod-1067-Bash游戏 V2
ACM模版描述题解根据题意不难发现,当A面对1的时候必胜,2的时候必输,3、4、5、6时必胜,7时必输,由此,知道7个一循环。所以,我们可以先打表,然后对(N - 1)进行对7的取模,对应输出结果即可。代码#include <iostream>using namespace std;const int win[] = {1, 0, 1, 1, 1, 1, 0}; // 2、7必输int ma原创 2016-08-02 00:58:53 · 427 阅读 · 0 评论 -
51Nod-1068-Bash游戏 V3
ACM模版描述题解从1开始找规律……(1必赢,0必输)不难发现,数位之和的奥妙。 序列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 局面 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 数位和 1 2原创 2016-08-02 08:58:01 · 611 阅读 · 0 评论