摘要:
数论题:线性方程看了《数论概论》的相关章节-《线性方程与最大公因数》首先是要证明一个方程必定有整数解ax+by=gcd(a,b); 为方便 g=gcd(a,b), ax+by=g这个证明有些复杂就不写了,而如何构造一个可行解(x1,y1)其实也在证明过程中在得到一个可行解后就可以得到无数组解,他们是(x1-k*(b/g) , y1+k*(a/g)) , (其中g=gcd(a,b),k是整数)而对于方程ax+by=c,只要c是g倍数那么就有整数解,否则没有看完原题,p是x/k的下整,q是x/k的上整,然后p*m+q*n=x,这个方程其实就是ax+by=c的形式,而且这个方程一定有整数解因为d=g 阅读全文
摘要:
线段树:一整段区间修改数值,并询问一段区间的和(不过这里询问的整个区间的和,固定的,当然原理是一样)这题要用到LAZY标记,决定自己写一下LAZY标记先说题意:一个连续的线段,材料可能为金银铜,数值对应3,2,1,一开始所有单元都是铜,所以整段的和就是n。然后多个修改操作,每次为x,y,z把区间[x,y]的每个单元都变为数值z。z的值为1,2,3。所有的修改操作做完后,输出整个线段的和然后说一下LAZY思想的本质,就是“只做表面功夫,内部其实不合格,当某一次需要访问到内部的时候,再对内部处理”,这种偷懒的思想就能减少操作的次数,因为每次访问到线段树的深度不一定一样,不需要全部都处理掉。这个思想 阅读全文
摘要:
线段树简单题:区间乘积,单点修改这题其实难度和之前的一样本来不想做的,但是学习了高手的代码,所以自己想实现一遍果然用了新的代码风格,时间大大提高,空间都减少,不过代码量好像没怎么变,一口气冲进了第10名10G-rated281MS1280K1572BC++2013-01-31 12:57:58#include <cstdio>#define N 50010const int MOD=1000000007;__int64 mul[4*N];int n,m;void updata(int a ,int b ,int p ,int e ,int root){ if(a==b) { ... 阅读全文
摘要:
线段树最简单的题目:区间求和,修改单点数值,中文题目就不说题意了今天看了神牛的代码感慨良多,写代码像写诗一样感觉自己的代码就是写得太累赘下次线段树要加大难度了#include <cstdio>#include <cstring>#define N 50010struct node{ int a,b; int sum;}tree[4*N];int n;void updata(int p ,int e , int root){ tree[root].sum+=e; if(tree[root].a==tree[root].b) return ; int m... 阅读全文
摘要:
线段树入门题中文题就不说题意了。就是基本的区间询问最大值和修改某个特定单元的值,初学线段树,自己硬生生啃出来的代码,写得不好,不过1Y了这道题很是鼓舞。时间上500ms,不知道那些100ms是怎么做到的#include <cstdio>#include <cstring>#define N 200010#define INF 0x3f3f3f3fstruct segment_tree{ int a,b; //区间 int l,r; //左右孩子 int max;}tree[2*N];int a[N];int tot; //线段树结点的个数int n,m; //区间长度和 阅读全文
摘要:
数学递推(DP)题意:有n个人,身高各不相同排成一列。从前面 看过去能看到p个人,后后面看过去能看到r个人。矮的人会被高的人挡着看不到。问满足p,r的情况下,有多少种排列的可能。/*DPdp[i][j][k]表示队列中有i个人,从前面可以看到j个人,后面可以看到k个人有多少种可能策略:从空队列开始,往其中插入人,从最高到最低插入,每次插入有3种位置,一种在队首,则从前面看的人数会加1,一种在队尾,则从队尾看的人数会加1,一种在中间(已经有n人在队中,那么有n-1个插入位置),则从队首和队尾看的人数 都不会增加状态转移方程 dp[i][j][k]=dp[i-1][j-1][k]+dp[i-1][ 阅读全文
摘要:
数学题:考查lcm和gcd题意:输入n,m,表示有n种不同的硬币,m张桌子。下面n行是n种硬币的数值,接下来m行是每个桌子高度。每个桌子都固定有4个脚而且高度一样。用硬币来组成桌脚,要求一只脚要用一样的硬币。对于每个桌子输出两个数字,一个是小于等于该桌子高度的最大值,一个是大于等于桌子高度的最小值就是枚举n个硬币中的4个,然后求4个硬币的最小公倍数,然后将这个lcm翻倍,只要满足 “一个是小于等于该桌子高度的最大值,一个是大于等于桌子高度的最小值”#include <cstdio>#include <cstring>#define N 55#define M 15#de 阅读全文
摘要:
黑书中(221页,第2章,数学方法与常见模型)费波那列素数定理费波那列素数:若某个费波那列数和比它小的所有费波那列数互质,则称它为费波那列素数若a是b的倍数,则fa是fb的倍数所以提示我们费波那列数和它的下标有关从第5个费波那列书开始,某项为费波那列素数当且仅当它的项数为素数其中最开始两个特殊的,第3,4项fib为2,3,它们是费波那列素数后面的则是第5,7,11,13,17,19,23,29………………项fibs是费波那列素数而素数表为2,3,5,7,11…………所以为了方便处理我们将素数表前两项改为3,4经典题目http://www.cnblogs.com/scau20110726/arc 阅读全文
摘要:
数论题、参考了 http://blog.csdn.net/clevermike/article/details/8177450这道题的详细分析在黑书中(221页,第2章,数学方法与常见模型)先看代码,代码中有注释//费波那列素数定理//费波那列素数:若某个费波那列数和比它小的所有费波那列数互质,则称它为费波那列素数//若a是b的倍数,则fa是fb的倍数//所以提示我们费波那列数和它的下标有关//从第5个费波那列书开始,某项为费波那列素数当且仅当它的项数为素数//其中最开始两个特殊的,第3,4项fib为2,3,它们是费波那列素数//后面的则是第5,7,11,13,17,19,23,29…………… 阅读全文
摘要:
数学题(找规律或者是递推)一个大饼,切n刀,大饼最多能被分成几分(每份大小可以不一样)其实只要在纸上画几个出来就能找到规律了。用文字来描述的话就是,在已经切了n刀的情况下而且是最优的,切第n+1刀怎么切还能最优呢?就要第n+1刀能和之前的n刀全部相交。递推公式为 f[0]=1; f[n]=f[n-1]+n (n>=1); 两者结合得 f[n]=(n*n+n)/2+1 (n>=0);#include <cstdio>#include <cstring>long long n;int main(){ while(scanf("%lld",&a 阅读全文