![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数学
文章平均质量分 50
AC_Arthur
Die luft der Freiheit weht
展开
-
Pseudoprime numbers(POJ-3641)(快速幂)
快速幂+素数判断p必须不是素数。#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;ll a,p;ll mod_pow(ll x,ll n,ll mod) { ll res = 1; while(n>0) {原创 2015-05-01 11:17:54 · 1029 阅读 · 0 评论 -
11040 - Add bricks in the wall(简单题)
一开始刷第十章的时候还没敢做这道题,其实是个大水题。。。观察一下就可以发现,最底下那行是可以利用倒数第三行全部求出来的。既然最后一行求出来了,那么依次向上即可求出整个金字塔。细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const double p = 0.5;原创 2015-09-05 08:47:22 · 622 阅读 · 0 评论 -
11105 - Semi-prime H-numbers(筛法)
该题新定义了一种H数,还有几个概念,要搞清楚:1.H素数:本身不是1,不能写成两个不是1的H数才乘积。2.H半素数:能写成2个H素数乘积的H数(注意,还得是H数)这样我们就可以利用筛选法的思想,通过类似筛法求素数的方法筛出所有H素数。细节参见代码:#includeusing namespace std;typedef long long ll;const int INF原创 2015-09-05 16:05:12 · 584 阅读 · 0 评论 -
1213 - Sum of Different Primes(DP)
该题是数学和DP的结合,其实递推法本身就很像DP ,且数学和DP都是很灵活的东西 。我在一开始想暴搜一下,找找规律(估计会超时),结果样例都跑不出来,也没看出小数据有什么规律,于是想到了DP,一开始应该就推对了,只是样例都不对,后来看别人的代码,发现素数的总和要从大到小枚举。 我们用d[i][j]表示j个素数相加为i的情况数 。 如果将i从小到大枚举,会出现重复枚举的情况,比如2,3和3原创 2015-09-05 13:17:18 · 552 阅读 · 0 评论 -
HDU 1222 Wolf and Rabbit(数论)
该题应该很少有人是我这样做的。。。我自己YY了一下,发现如果狼转了一圈之后没能走回起点,那么它一定能在若干圈之后经过所有洞穴,但是具体证明我还没有想好。 正确性未知。一开始WA是因为忽略了一些特殊情况以及n和m的大小关系。细节参见代码:#include#include#include#include#include#include#includeusing namespa原创 2015-10-06 08:18:30 · 617 阅读 · 0 评论 -
HDU 2824 The Euler function(筛法求欧拉phi函数)
该题就是一个筛法求欧拉phi函数值,我预处理了前缀和,没想到比直接求还慢。。。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const int maxn =原创 2015-10-06 08:36:51 · 968 阅读 · 0 评论 -
Codeforces Round #323 (Div. 2) C. GCD Table
根据数表形成的规则,可以很轻松的发现,当前数表中最大的两个数一定是原数列中的数,求出它们的gcd,那么当前数表中一定有两个gcd是他们形成的,将其去除。用什么容器维护都可以,我用的multiset 细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const in原创 2015-10-09 22:00:26 · 609 阅读 · 0 评论 -
NYOJ 139 我排第几个(康托展开)
对于每一个字符,假设它后面有k个字符比它小,则当前序列的排序会增大k*f[12-i],其中f[i]是是i的阶乘。原创 2015-10-11 09:25:09 · 722 阅读 · 0 评论 -
HDU 5212 Code(容斥)
题意: 输入n个数, 求这n个数的n^2个两两组合的最大公约数x,x(x-1)之和 。换个思路, 我们如果求出了最大公约数为x的对数cnt, 那么答案就增加x(x-1)cnt^2那么怎么求以x为最大公约数的对数呢?我们枚举x的整数倍, 这样就可以知道这些数中是x的整数倍的数有多少个。原创 2015-12-12 15:09:34 · 801 阅读 · 0 评论 -
HDU 5505 GT and numbers(GCD魔法)
题目链接:点击打开链接题意:给两个数n和m, n每次乘以它的因子变成一个新的值, 求最少乘几次可以变成m。思路:每次乘以的整数v有两个要求:1.它是n的因子;2.它要尽量大。又因为如果n能最终到达m,一定是乘以n的k倍, 所以只要n能被m整除, 那么每次取gcd(n, m/n)就行了。细节参见代码:#include#include#include#include#inc原创 2016-02-03 12:07:26 · 953 阅读 · 0 评论 -
Educational Codeforces Round 9(D. Longest Subsequence(筛法))
题目链接:点击打开链接题意:给定n个数, 求一个最长的不连续子序列, 使得子序列中所有元素的最小公倍数 思路:因为最小公倍数 筛法复杂度是O(nlogn)。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#inclu原创 2016-03-03 16:26:58 · 1066 阅读 · 0 评论 -
HDU 4248 A Famous Stone Collector(DP + 组合数)
题目链接:点击打开链接思路:DP + 组合数。 用d[i][j]表示前第i种颜色的石头, 已经用了j个的方法数, 每次枚举第i种石头放多少个, 假设放k个, 那么相当于从j个位置中选k个, 预处理组合数就行了。细节参见代码:#include#include#include#include#include#include#include#include#include#原创 2016-04-20 21:37:12 · 1413 阅读 · 0 评论 -
Codeforces Round #360 (Div. 1) B. Remainders Game(中国剩余定理)
题目链接:点击打开链接思路:中国剩余定理, 请看维基百科:点击打开链接该题我们由已知可以写出n个线性同余方程:x % c[i] == a[i] % c[i]。那么中国剩余定理中明确指出。 我们可以知道 x % lcm(c[i]) 的值。 那么如果lcm可以整除k而不产生余数, 我们也就知道了x % k的值, 它就等于 x % lcm的值。细节参见代码:#include原创 2016-07-07 17:06:31 · 1386 阅读 · 2 评论 -
10622 - Perfect P-th Powers(唯一分解定律)
根据完全P次方数的定义可知,一定会借助唯一分解定律,那么必然预处理素数表 。但是仅仅唯一分解还是不够的,要怎么求最大的幂呢? 我们来举几个例子,加入唯一分解成2 2 3,那么答案是1 , 如果 2 2 2 ,答案是3,如果 2 2 3 3 ,答案是2, 可以发现,其实答案就是各质数的指数的最大公约数。 但是WA了,因为题目并没有说输入的一定是正整数,而且给过提示原创 2015-09-04 21:27:17 · 708 阅读 · 0 评论 -
10539 - Almost Prime Numbers
这种题目,数据范围很大,一般都是很难直接打表的,所以可以依靠已经筛出的素数直接暴力。虽然区间范围很大,但是根据题目的定义我们可以知道,满足条件的数一定是一个素数的2或2以上的幂,那么实际上这个增长速度是很快的,即使10^12也可以快速扫完。跑了0.049s,还是很快的。细节参见代码:#includeusing namespace std;typedef long long ll原创 2015-09-04 19:32:50 · 692 阅读 · 0 评论 -
12034 - Race(递推)
搞了快一个月的高效和动归了, 太费脑子,水一道数学~ 该题是递推题,动归没白搞,很快就写出来了 。 现在有点明白为什么比赛要测试栈深了,递归的应用实在是太多了 。一般对某数取模是因为答案太大会爆long long , 至于为什么要对这么奇怪的一个数取模,好像是因为这样答案离散的比较好?有清楚的朋友希望不吝赐教 !代码如下: #includeusing namespace std原创 2015-07-28 18:50:55 · 685 阅读 · 0 评论 -
10288 - Coupons (数学期望)
没什么好说的了,看代码吧:#includeusing namespace std;typedef unsigned long long ll;int n,m;ll gcd(ll a,ll b) { return b == 0 ? a : gcd(b,a%b);}int gainLen(ll a) { int cnt = 0; while(a > 0) {原创 2015-08-25 09:58:04 · 836 阅读 · 0 评论 -
UVA 10214 - Trees in a Wood.
题目的提示已经很明显了,预处理phi(x)函数,有一部分要直接统计,O(a^2)的复杂度。细节参见代码:#includeusing namespace std;typedef long long ll;const int maxa = 2005;const int maxb = 2000005;int n,m,phi[maxa+5];ll a,b;void init() {原创 2015-09-01 21:33:03 · 685 阅读 · 0 评论 -
11440 - Help Tomisu(计数问题)
细节参见代码:#includeusing namespace std;typedef long long ll;const int mod = 100000007;const int maxn = 10000000+5;int T,kase=0,vis[maxn] = {0};ll n,m,k,phi[maxn];void sieve(int nn) { int m =原创 2015-09-02 09:32:09 · 591 阅读 · 0 评论 -
1638 - Pole Arrangement (递推)
该题用到了DP的思想,递推出所有可能情况 。要想维护所有状态,求出要求的情况,那么显然要维护三个量:几根杆子(DP的序)、从左边看杆子的数量、从右边看杆子的数量 。所以状态表示也要增加相应的维度,用d[i][j][k]表示前i根杆子,从左边看有j根,从右边看有k根的可能情况 。接下来就要想好如何转移状态了 : 当前状态肯定要依赖于上一阶段的状态,那么我们不妨想:当前状态与上一状态的不同原创 2015-08-18 19:32:23 · 847 阅读 · 0 评论 -
1637 - Double Patience (概率DP)
一道状态较多的概率DP,想要表示所有的状态显然要拓展几个维度表示九堆牌当前的状态 。但是这么写太复杂,所以我们不妨用一个vector来储存状态,将dp数组用一个map来表示,即 map ,double> d; 利用vector可以作为函数参数传递这个优点,将大大节省代码量 。概率很好求,在每一次迭代中,寻找所有可以转移的状态数tot,那么状态转移就是d[i] = sum(d[i-1])/t原创 2015-08-18 21:49:28 · 961 阅读 · 0 评论 -
1210 - Sum of Consecutive Prime Numbers(数学水题)
很简单的数学题,用两个变量维护区间端点就行了,高效那一章的思想。细节参见代码:#includeusing namespace std;typedef long long ll;const int maxn = 12000;int n,m,k,vis[maxn];vector prime;void init() { memset(vis,0,sizeof(vis));原创 2015-09-03 09:41:32 · 764 阅读 · 0 评论 -
1262 - Password (暴力枚举)
该题应该是用数学的组合知识做,不过因为密码格子很小,暴力枚举很快而且不容易做错 。需要注意一点,因为每一列中可能有重复的字母,所以会出现重复的密码,因此要在dfs之前排序去重。细节参见代码:#includeusing namespace std;int T,k,n,m,cnt;char s1[10][10],s2[10][10],ans[10],len[10],a1[10][10原创 2015-08-19 09:42:03 · 815 阅读 · 0 评论 -
557 - Burger(递推)
该题正解是递推, 我一开始就老老实实的算的概率,用到了例题“Candy”的算法,确实算出了正确答案,但是也许测试组数非常多,最终超时。后来打了一张巨表(确实可以打出来的,这个表非常有规律,连续的很多n的概率是一样的,大概用几分钟),但知道不是正解,也就算了。正解是递推,反着求最终二人不能吃到相同汉堡的概率,用组合数概率公式很容易表示出其通项公式:f(i) = 2^(2-i)*C(i-2,(原创 2015-09-04 15:26:22 · 672 阅读 · 0 评论 -
11971 - Polygon(连续概率)
该题限制较少,运用连续概率公式即可。细节参见代码:#includeusing namespace std;typedef long long ll;const int maxn = 10000;int T,kase=0;ll n,k;ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b);}int main() {原创 2015-09-02 09:12:10 · 533 阅读 · 0 评论 -
1639 - Candy (数学期望)
该题如果用普通方法,精度损失太大,而且组合数也太大,难以求解。但是如果用组合数公式,阶乘又太大,会溢出,所以我们可以采用取对数的方法,将组合数和取对数操作一起进行,然后用库函数exp()转换回来就行了。细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const原创 2015-09-04 10:24:54 · 559 阅读 · 0 评论 -
294 - Divisors(唯一分解定律)
该题运用了唯一分解定律,详情请见lrj紫书P321,一个数的约数的个数就是将该数唯一分解之后,各质因子的系数+1之积 。虽然有一个快速算每一个数的约数个数的欧拉phi函数值,但是该题的数据范围非常大,数组存不下,而且区间差非常小,显然事先算出每一个数的约数个数不是一个明智的决定。 所以我们用的时候再算也不迟。 那么我们需要事先打出素数表,要多少素数呢? sqrt(10^9)就够了,因为如果一个素原创 2015-09-04 16:45:31 · 675 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2)C. Arpa's loud Owf and Mehrdad's evil plan(dfs&lcm)
题目链接:点击打开链接思路:很简单的一道题, dfs之后求n个数的lcm就行了, 从网上扒下来一个lcm,mdzz死循环了。。不对的代码你贴个XX细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #原创 2016-12-07 11:49:19 · 718 阅读 · 0 评论