随笔分类 - sgu
摘要:题意 给出一个n*m的格子,要求用1*2的块和2*2缺一角的块填满,求方案数分析 状压dp,以下来自nocow: 状态压缩DP,转移的时候情况很多,要一个个写出来理清楚再写。 一行一行推,opt1为上一行的状态,opt2为当前行的状态,u1,u2分别为上下两行是否与左边相连而凸出来。/* Case 1 2 3 4 5 6 7 | +- | L or U L| or U| -+ or -+ L or U or L or U | | +- -- -- -+ -+ W| L| W W L L old L : connect with Left block U : connect with ...
阅读全文
摘要:题意 求一个无向图中没有重边的两条最短路,并输出方案分析 注意,是两条最短路!不是一条最短一条次短!所以先来个dijkstra/spfa来算一下最短路 根据dijkstra/spfa求出的dist[i]数组,建立一个新图,上面只有所有满足最短路的边构成的图 这样,建图就Ok了,下面如何解决没有重边呢? 很显然,设立一个源点和汇点,在源点出放出2的值。然后把刚刚建好的新图,边的权值设为1,相当于只能允许一个人经过。这样,如果在汇点得到了2的值,说明这样的两条路是存在的,再利用一个dfs求出即可。 注意dinic需要加上当前弧优化,不然会tle at #17Accepted Code ...
阅读全文
摘要:题意 一个圆上有2k点,请输出点于点之间连线使得所分区域块数最小的方案总数以及区域数分析 2k个点最少能把平面分成k+1的区域,易证; 至于方案数,利用递推和乘法原理 令f[i]表示2i个点时的方案数,f[0]=f[1]=1,则f[i]=sigma(f[j]*f[i-j-1],0<j<i) 具体参见百度百科:卡特兰数列Accepted Code 1 /* 2 PROBLEM:sgu130 3 AUTHER:Rinyo 4 MEMO:数学 5 */ 6 #include<cstdio> 7 long long f[40]; 8 int...
阅读全文
摘要:题意 给出n个四位数组成的电话号,要求安排在一个电话本里,从第三页开始安排。使得每一页都是一个数字开头的电话号,且每一页不超过k个;如超过了,则新开一页记录分析 无聊的题。开个数组记录每个数字开头的号码有多少个,然后利用div k记录答案,如果不是整除,则再加一页 注:答案+2Accepted Code 1 /* 2 PROBLEM:sgu127 3 AUTHER:Rinyo 4 MEMO:模拟 5 */ 6 #include<cstdio> 7 int a[10]; 8 int main() 9 {10 int k,n,x;11 scanf("%...
阅读全文
摘要:题意 有两个盒子,一个里面有a个球,另一个有b个球。现在请你把其中一个盒子的球转移到另一个去,转移的数目是另一个盒子里球的个数。 现在问你几次能把所有球转移到一个盒子里。分析 2k=(a+b)/gcd(a,b),k即为答案 具体怎么证得?我再研究研究0.0Accepted Code 1 /* 2 PROBLEM:sgu 126 3 AUTHER:Rinyo 4 MEMO:数学题 5 */ 6 #include<cstdio> 7 int gcd(int a,int b){return b==0?a:gcd(b,a%b);} 8 int main() 9 {10 ...
阅读全文
摘要:题意 给出一个n*n的数组b,b[i,j]表示在数组a中,比a[i,j]大的上下左右一共有多少个 求一个满足b的a分析 数据范围n<=4,很明显,深搜 对于每一个格子,从1~n*n枚举,在检查上一个合法之后,进行下一步的搜索Accepted Code 1 { 2 PROBLEM:sgu125 3 AUTHER:Rinyo 4 MEMO:深搜 5 } 6 Program sgu125; 7 Const 8 Infile = 'sgu125.in'; 9 Outfile = 'sgu125.out';10 dx:Array[1....
阅读全文
摘要:题意 给出由n条线段围成的多边形(每条边均平行于坐标轴),以及一个点(x0,y0),问这个点是在形内或是形外或是形上分析 对于在线段上,比较容易判断,直接比较一下坐标的位置即可; 若不在形上,则在该点处向上引一条射线。因为是向上引的,所以只和与x轴平行的线有交点,记录交点个数。 注意在记录交点个数时,如果在一条线段的短点,只记一侧的,别记重了。 这样,统计相交次数。如果为奇数,则在形内;偶数,形外。 注意读入数据后比较一下大小并交换。Accepted Code 1 /* 2 PROBLEM:sgu 124 3 AUTHER:Rinyo 4 MEMO:计算几...
阅读全文
摘要:题意 求斐波那契数列前n项和分析 1.因为数据较小,直接算出来相加可过 2.有结论:s[n]=f[n+2]-1 利用数学归纳法,证明如下: 1)当n=1时,s[1]=f[1]=1,f[1+2]-1=1,所以s[1]=f[3]-1; 2)假设n=k(k>=1)时,命题成立 则有s[k]=f[1]+f[2]+……+f[k]=f[k+2]-1=f[k]+f[k+1]-1 则当n=k+1时,s[k+1]=(f[1]+f[2]+……+f[k])+f[k+1] =f[k]+f[k+1]+f[k+1]-1 ...
阅读全文
摘要:题意 给出n,表示这是一个正n边形,并给出顺时针标号的n1,n2个点的坐标。输出所有点的坐标。分析 计算几何。 主体思路: 利用n1,n2计算出这个正n边行的半径,进而求得中心坐标; 再利用向量旋转,从中心坐标开始,依次获得各个点坐标。 有关向量旋转参见百度文库http://wenku.baidu.com/view/3f95940cbb68a98271fefa75.html 主要用到的就是x1=x*cosθ-y*sinθ y1=x*sinθ+y*cosθ 具体在程序中的变量以下图为例:Accepted Code 1 { 2 PROBLEM:sg...
阅读全文
摘要:题意 给出三个数n,a1,b1,表示n|a1*x+b1*y对任意(x,y)成立。现在求出有多少对(a2,b2)使得n|a2*x+b2*y也成立,并打印所有符合要求的(a2,b2)分析 因为a1,b1是满足要求的,当a2=(k*a1)%n,b2=(k*a2)%n为满足条件的a2b2,直到(a2,b2)=(a1,b1)结束Accepted Code 1 /* 2 PROBLEM:sgu119 3 AUTHER:Rinyo 4 MEMO:数学 5 */ 6 7 8 #include<cstdio> 9 #include<algorithm>10 using names...
阅读全文
摘要:题意 定义f(n)为n各位数字之和,如果n是各位数,则n个数根是f(n),否则为f(n)的数根 现在给出n个Ai,求出A1*A2*…*AN+ A1*A2*…*AN-1+ … + A1*A2+ A1这个式子的数根 多组数据分析 首先,要知道这样一个结论: 任何一个整数模9同余于它的各数位上数字之和 具体证明过程如下: 设自然数N=a[n]a[n-1]…a[0],其中a[0],a[1]、…、a[n]分别是个位、十位、…上的数字 再设M=a[0]+a[1]+…+a[n] 求证:N≡M(mod 9). 证明: ∵ N=a[n]a[n-1]…a[0]=a[n]*10^n+a[n-...
阅读全文
摘要:题意 给出n,m,k 接下来有n个数ai,求这些数中有多少个ai*m能被k整除 输出个数分析 首先将k分解质因数,p[i]存的是第i个因子,num[p[i]]表示p[i]这个因子有多少个 将ai*m分解质因数,如果ai*m的质因数中,没有某个p[i],或质因数中某个p[i]的个数少于k中p[i]的个数(即num[p[i]]),那么,这个数就不符合要求 只有这个数的质因数包含了所有p[i],并且每个p[i]都至少有num[p[i]]个,则这个数是可以的,答案+1 在处理这道题上,我们可以1~len(k的质因数个数)循环,对每个数now进行计算,如果当前的num[p[i]]>t*...
阅读全文
摘要:题意 首先定义超级素数:2 3 5 7...这些都是素数,当这个数是素数且这个数在这个素数列里的第素数个位置,则为超级素数 例如,3在第2个,是超级素数;7在第4个,由于4不是素数,所以7不是超级素数 现在给定一个数n,求n最少能被几个超级素数之和表示,输出个数,并输出这几个超级素数 如果不能表示为几个超级素数之和,输出0分析 首先,利用筛法可以求出1~n内的超级素数,显然,需要用到的素数绝对不会超过n (当然你也可以直接打表) 预处理做好了,下面就是完全背包了 f[i]表示i最少能由f[i]个超级素数表示 所求即为f[n] 初始f[0]=0 方程为f[j]=min{f[...
阅读全文
摘要:题意 已知2001.1.1是周一 请你求出2001.m.n是周几 如果m,n不合法 输出Impossible分析 开一个数组记录一下每个月的日子,然后模拟 通过循环加到当前的日子 mod 7 即可求出为周几 这题让我想到了usaco的那道星期五是几的题....Accepted Code 1 /* 2 PROBLEM:sgu 115 3 AUTHER:Rinyo 4 MEMO:模拟 5 */ 6 7 #include<cstdio> 8 const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; ...
阅读全文
摘要:题意 百慕大的每一座城市都坐落在一维直线上。这个国家的政府决定建造一个新的广播电视台。经过了许多次试验后,百慕大的科学家们提出了一个结论,在每座城市的不满意度等于这座城市的市民数与这座城市与广播电视台的距离的乘积。找到这个一维直线上的一点来建造广播电视台,使得所有城市的不满意度的和最小分析 易证,这个广播电视台必然会建在某个城市点上,否则必然不是最优解 当每个城市都是1个人时,只有当电视台建在中间那个城市,所有人到电视台距离之和才为最小 (奇数个城市时是中间的那个城市;偶数个城市时则为中间两个城市中的任意一个即可。) 但是,每个城市不止一人,该怎么处理呢? 很容易,把每个城市的若干...
阅读全文
摘要:题意 给出一个数n,如果n能分解成两个质数相乘,则输出Yes,否则输出No 多case.分析 首先先用筛法预处理出1~40000以内的质数,共tot个 然后for (1~tot)循环,如果n能被prime[i]整除,并且除数也是质数,则为Yes,否则为NoAccepted Code 1 /* 2 PROBLEM:sgu113 3 AUTHER:Rinyo 4 MEMO:模拟 质数 5 */ 6 7 #include<cstdio> 8 int prime[40030]; 9 int isprime(int x)10 {11 if (x<2) retur...
阅读全文
摘要:题意 给出一个a一个b,求a^b - b^a分析 高精度不解释 需要写三个高精度: mult-计算乘法 compare-比较两个数的大小 minus-计算减法Accepted Code 1 { 2 PROBLEM:SGU112 3 AUTHER:Rinyo 4 MEMO:高精度 模拟 5 } 6 Program sgu112; 7 Type 8 Rec = REcord 9 len:Longint;10 a:Array[0..1130]Of Longint;11 End;12 Var13 a,b,aa,bb,i:Lon...
阅读全文
摘要:题意 给出一个数n,求sqrt(n) (1≤n≤101000)分析 题意很简单,就是开一个数的平方 在网上看了看一些方法,一下摘自“风中落叶”hi.baidu.com/xiamengy1.举例上式意为65536的开平方为256。手开方过程类似于除法计算。为了方便表述,以下仍称类似位置的数为“被除数”、“除数”、“商”。以65536为例,其具体计算过程如下:Step1:将被开方数(为了形象,表述成“被除数”,此例中即为65536)从个位往高位每两位一断写成6,55,35的形式,为了方便表述,以下每一个“,”称为一步Step2:从高位开始计算开方。例如第一步为6,由于22=4<6<9=
阅读全文
摘要:题意 给出一个n*n的棋盘,现有游戏规则如下: 玩家一开始在左上角的格子里,魔术师给出多条指令,每条指令包含两个信息: 1、玩家走的步数(>=n,且不重复) 2、魔术师要删除的格子 魔术师可以删除一些这一步走不到的格子,并继续发出指令,知道所有格子(除了一个)被删除,并且玩家被逼到了这个格子中。 求发出指令的一组可行方案分析 不难发现,第一条指令肯定是让玩家走n步,之后步数逐渐增加 我们可以将这个棋盘像国际象棋棋盘那样,黑白染色 易证,走奇数步时会走到另一种颜色上,所以我们只需要每次让玩家走到另一种颜色上去,把相反颜色的格子删掉 但是这样删有两点问题:1、如果一开始n就为偶...
阅读全文
摘要:题意 定义d(n):d(n)=n+[n的各位数之和] 如果某个数不能由一个数通过多次d(n)得到这个数,那么称这个数为“自我数” 比如:d(12)=12+1+2=15 d(d(12))=d(15)=15+1+5=21 d(d(d(12)))=d(d(15))=d(21)=21+2+1=24 ………… 则15、21、24等数都是可以得到的,不是“自我数” 而例如20,则就不能通过由某个数多次d(n)得到,所以20为一个“自我数” 现在给定一个n和m,求1~n中“自我数”的个数 并且输出其中第a[i]个(i∈[1,m])“自我数”分析 不难想到,通过筛...
阅读全文
浙公网安备 33010602011771号