51Nod
JinbaoSite
不忘初心,方得始终。
展开
-
【51Nod】1126 求递推序列的第N项
题意有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值。解题思路存在循环节,只需要找到循环节即可。判断是否为循环节的方法是当连着两项为1时,即找到了循环节。参考代码#include <iostream>using namespace std;int f[300]原创 2017-07-19 23:09:10 · 927 阅读 · 0 评论 -
【51Nod】1344 走格子
题意有编号1-n的n(1 <= n <= 50000)个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去。机器人有一个初始能量,每个格子对应一个整数A[i](-1000000000 <= A[i] <= 1000000000),表示这个格子的能量值。如果A[i] > 0,机器人走到这个格子能够获取A[i]个能量,如果A[i] < 0,走到这个格子需要消耗相应的能量,如果机器原创 2017-06-22 22:28:29 · 664 阅读 · 0 评论 -
【51Nod】1035 最长的循环节
题意正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数。1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1) 循环节长度为1解题思路模拟求出1~1000内所有循环节长度。求循环节通过判断余数出现的次数来确定是否出现循环原创 2017-07-10 23:07:52 · 846 阅读 · 0 评论 -
【51Nod】1413 权势二进制
题意一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成。例如0,1,101,110011都是权势二进制而2,12,900不是。 当给定一个n(1<=n<=1,000,000)的时候,计算一下最少要多少个权势二进制相加才能得到n。解题思路例如1235678,我们表示如下: 1–11111111 2–01111111 3–00111111 4–00011111 5–0000原创 2017-06-03 19:35:22 · 857 阅读 · 0 评论 -
【51Nod】1096 距离之和最小
题意X轴上有N(2 <= N <= 10000)个点,求X轴上一点使它到这N个点的距离之和最小,输出这个最小的距离之和。解题思路要使得距离之和最小,那么就是取最中间的那个数作为中心点。参考代码#include <iostream>#include <algorithm>using namespace std;#define MAXN 10000+5typedef long long ll;原创 2017-06-06 21:59:08 · 775 阅读 · 0 评论 -
【51Nod】1433 0和5
题意小K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5。小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数。使得这个数尽可能大,而且可以被90整除。 注意: 1.这个数没有前导0, 2.小K不需要使用所有的牌。解题思路本题关键在于555555555%9=0,所以至少需要9个5、一个0组成的数 能被90整除或者0被90整除。参考代码#include <iostre原创 2017-06-02 13:10:57 · 890 阅读 · 0 评论 -
【51Nod】1138 连续整数的和
题意给出一个正整数N(3 <= N <= 10^9),将N写为若干个连续数字和的形式(长度 >= 2)。例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8。如果不能写为若干个连续整数的和,则输出No Solution。解题思路假设n=a+...+(a+k)n=a+...+(a+k),那么n=a∗k+k∗(k−1)2n=a*k+\frac{k*(k原创 2017-06-02 11:18:27 · 660 阅读 · 0 评论 -
【51Nod】1284 2 3 5 7的倍数
题意给出一个数N(1 <= N <= 10^18),求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。解题思路容斥原理,先计算n/2+n/3+n/5+n/7,然后减去n/6+n/10+n/14+n/15+n/21+n/35,又得加上n/30+n/42+n/70+n/105,最后再减去n/210参考代码include <iostream>using原创 2017-05-22 07:54:43 · 777 阅读 · 0 评论 -
【51Nod】1305 Pairwise Sum and Divide
题意有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor((A[i]+A[j])/(A[i]*A[j])) return sum给出数组A(1 <= N <=原创 2017-05-21 23:38:23 · 554 阅读 · 0 评论 -
【51Nod】1181 质数中的质数(质数筛法)
题意如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N(N <= 10^6),求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。解题思路求出N <= 10^6内所有的素数,然后求出一些略大于它的素数。然后在素数的素数下二分查找得到答案。参考代码#include <iostream>#incl原创 2017-06-12 12:14:06 · 766 阅读 · 0 评论 -
【51Nod】1432 独木舟
题意n个人,已知每个人体重。独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?解题思路每一回考虑体重最重的人跟最轻的人能不能上,不能就最重的人上,能就两个人上。参考代码#include <iostream>#include <algorithm>using namespace std;#def原创 2017-06-12 12:25:03 · 747 阅读 · 0 评论 -
【51Nod】1081 子段求和
1单选(2分) 以下距离度量方法中,要对样本点的各个属性进行标准化的是: A.马氏距离 B.欧氏距离 C.曼哈顿距离 D.夹角余弦正确答案:A2单选(2分) 以下不属于无监督学习的算法是: A.KMeans B.DBSCAN C.PCA D.KNN正确答案:D3多选(2分) 无监督学习的两大主要任务分别是: A.聚类 B.降维 C.分类 D.回归正确答案:A、B4多选(原创 2017-06-10 23:51:36 · 594 阅读 · 0 评论 -
【51Nod】1242 斐波那契数列的第N项
题意斐波那契数列的定义如下: 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的结果即可。解题思路[F(n)F(n−1)]=[1110]∗[F(n原创 2017-07-18 21:59:14 · 890 阅读 · 0 评论 -
【51Nod】1770 数数字
题意统计一下aaaa…aaa*b的结果里面有多少个数字d,a,b,d均为一位数,a的个数为n个。解题思路aaaa…aaa*b必定有一部分是重合的。我们找到重合的地方,将不重合的找出来,对比d,计算d的个数。 8*7=56 88*7=616 888*7=6216 888*7=62216 8888*7=622216 … 88…88*7=622…2216参考代码#include <bits/原创 2017-07-08 23:32:12 · 764 阅读 · 0 评论 -
【51Nod】1137 矩阵乘法
题意给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果。题意由于n的大小只有100,所以可以直接计算。参考代码#include <bits/stdc++.h>using namespace std;int a[101][101],b[101][101],c[101][101];int main(){ int n; while (cin>>n){ for原创 2017-07-07 23:16:32 · 921 阅读 · 0 评论 -
【51Nod】1347 旋转字符串
题意S[0…n-1]是一个长度为n的字符串,定义旋转函数Left(S)=S[1…n-1]+S[0].比如S=”abcd”,Left(S)=”bcda”.一个串是对串当且仅当这个串长度为偶数,前半段和后半段一样。比如”abcabc”是对串,”aabbcc”则不是。 现在问题是给定一个字符串,判断他是否可以由一个对串旋转任意次得到。解题思路一个对串旋转任意次得到还是一个对串。参考代码#include原创 2017-07-16 22:27:34 · 876 阅读 · 0 评论 -
【51Nod】1106 质数检测
题意给出N个正整数,检测每个数是否为质数。如果是,输出”Yes”,否则输出”No”。解题思路对于每个正整数,进行素数判断。参考代码#include <bits/stdc++.h>using namespace std;bool isprime(int x){ if (x<2) return 0; if (x==2 || x==3 || x==5 || x==7)原创 2017-07-06 22:54:49 · 977 阅读 · 0 评论 -
【51Nod】1058 N的阶乘的长度
题意输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。解题思路n!的长度等于log10(n!)参考代码#include <bits/stdc++.h>using namespace std;typedef long long ll;int main(){ int n; while (cin>>n){ double tmp=1;原创 2017-07-14 23:04:08 · 761 阅读 · 0 评论 -
【51Nod】1117 聪明的木匠
题意一位老木匠需要将一根长的木棒切成N段。每段的长度分别为L1,L2,……,LN(1 <= L1,L2,…,LN <= 1000,且均为整数)个长度单位。我们认为切割时仅在整数点处切且没有木材损失。 木匠发现,每一次切割花费的体力与该木棒的长度成正比,不妨设切割长度为1的木棒花费1单位体力。例如:若N=3,L1 = 3,L2 = 4,L3 = 5,则木棒原长为12,木匠可以有多种切法,如:先将12原创 2017-06-13 23:15:14 · 794 阅读 · 0 评论 -
【51Nod】1082 与7无关的数
题意一个正整数,如果它能被7整除,或者它的十进制表示法中某个位数上的数字为7,则称其为与7相关的数。求所有小于等于N(1 <= N <= 10^6)的与7无关的正整数的平方和。 例如:N = 8,<= 8与7无关的数包括:1 2 3 4 5 6 8,平方和为:155。解题思路求出所有与7无关的数,并求所有小于等于N的与7无关的正整数的平方和 注意,要使用long long参考代码#include原创 2017-07-03 23:12:56 · 876 阅读 · 0 评论 -
【51Nod】1266 蚂蚁
题意n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。请计算各种情况当中,所有蚂蚁落下竿子所需的最短时间和最长时间。 例如:竿子长10cm,3只蚂蚁位置为2 6 7,最短需要4秒(左、右、右),最长需要8秒(右、右、右)。解原创 2017-06-05 18:48:48 · 1280 阅读 · 0 评论 -
【51Nod】1174 区间中最大的数
题意给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。 例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)解题思路RMQ经典问题参考代码#include <iostream>using namespace std;const int MAXN = 10010;int dp原创 2017-05-30 23:37:48 · 564 阅读 · 0 评论 -
【51Nod】1008 N的阶乘 mod P
题意输入N和P(P为质数),求N! Mod P = ?解题思路根据(a∗b∗c)%p=((a∗b)%p∗c)%p(a*b*c) \% p = ((a*b)\%p*c)\%p,我们将两个数相乘后求余,求余的值跟下个数相乘后求余,再跟下个数相乘后求余,一直迭代下去。参考代码#include <iostream>using namespace std;typedef long long ll;int原创 2017-04-26 19:29:13 · 592 阅读 · 0 评论 -
【51Nod】1011 最大公约数GCD
题意求最大公约数解题思路辗转相除法:gcd(a,b)=gcd(b,a%b)参考代码#include <iostream>using namespace std;int gcd(int a,int b){ if (b==0) return a; return gcd(b,a%b);}int main(){ int a,b; while (cin>>a>>b){原创 2017-04-26 22:14:24 · 600 阅读 · 0 评论 -
【51Nod】1012 最小公倍数LCM
题意输入2个正整数A,B,求A与B的最小公倍数。解题思路先求出最大公约数K,那么最小公倍数为A*B/K参考代码#include <iostream>using namespace std;typedef long long ll;int gcd(int a,int b){ if (b==0) return a; return gcd(b,a%b);}int main(){原创 2017-04-26 22:18:08 · 799 阅读 · 0 评论 -
【51Nod】1384 全排列
题意给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”, 输出为: 1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211解题思路借助#include <algorithm>库里的sort和next_permutation。 sort函数先将字原创 2017-05-26 21:08:12 · 682 阅读 · 0 评论 -
【51Nod】1118 机器人走方格
题意M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。解题思路dp[i][j]:表示走到第i行第j列的走法数 状态转移方程为: dp[i][j]=(dp[i-1][j]+dp[i][j-1])%1000000007;参考代码#include <iostream>using namespace std原创 2017-05-25 22:51:43 · 691 阅读 · 0 评论 -
【51Nod】1013 3的幂的和
题意求:3^0 + 3^1 +…+ 3^(N) mod 1000000007解题思路由等比数列的前n相和,我们可以得到 3n+1−12%1000000007\frac{3^{n+1}-1}{2} \% 1000000007 我们知道AB%C≠A%CB%C%C\frac{A}{B} \% C \neq \frac{A\%C}{B\%C}\%C和(A∗B)%C=(A%C∗B%C)%C(A*B)\%C原创 2017-05-24 15:04:59 · 1089 阅读 · 0 评论 -
【51Nod】1014 X^2 Mod P
题意X*X mod P = A,其中P为质数。给出P和A,求<=P的所有X。解题思路从0~P枚举X,把满足条件的X输出。参考代码#include <iostream>using namespace std;typedef long long ll;int main(){ ll p,a; while (cin>>p>>a){ int cnt=0;原创 2017-05-23 19:19:30 · 678 阅读 · 0 评论 -
【51Nod】1182 完美字符串
题意约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。 约翰不在乎字母大小写。(也就是说字母F和f)的完美度相同。给定一个字符串,输出它的最大可能的完美度。例如:dad,你可以将26分配给d,25分配给a,这样整个字符串完美度为77。解题思路要使得字符串完美度最大,需要让26分配给字母最多的,25分配给字母第原创 2017-05-23 09:32:01 · 602 阅读 · 0 评论 -
【51Nod】1018 排序
题意给出N个整数,对着N个整数进行排序解题思路利用库里的sort()函数参考代码#include <iostream>#include <algorithm>using namespace std;#define MAXN 50000+5int a[MAXN];int main(){ int n; while (cin>>n){ for (int i=0;i原创 2017-04-26 22:26:28 · 682 阅读 · 0 评论 -
【51Nod】1004 n^n的末位数字
题意给出一个整数N,输出N^N(N的N次方)的十进制表示的末位数字。解题思路观察下列 1->1 2->4->8->6->2 3->9->7->1->3 … 我们发现存在循环,因此,我们算出循环,保存循环的结果,在结果中找是哪个值出现。参考代码#include <iostream>#include <string.h>using namespace std;typedef long l原创 2017-04-26 22:47:01 · 582 阅读 · 0 评论 -
【51Nod】1015 水仙花数
题意水仙花数是指一个 n 位数 ( n >= 3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153) 给出一个整数M(10 <= M <= 1000),求 >= M的最小的水仙花数。解题思路先求出2000内所有的水仙花数,然后对于M,从M位置往后寻找符合条件的水仙花数参考代码#include <iostream>#include <string原创 2017-05-18 10:24:55 · 936 阅读 · 0 评论 -
【51Nod】1283 最小周长
题意一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值。例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小,为20。解题思路设长宽为x,y,则 S=xy, z=2*(x+y) 即 z=2*(x+S/x)>=2*sqrt(S),但且仅当x=S/x。 所以x=sqrt(S)。参考代码#include原创 2017-05-19 09:47:50 · 750 阅读 · 0 评论 -
【51Nod】1095 Anigram单词
题意一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的Anigram,例如单词army和mary互为Anigram。现在给定一个字典,输入Q个单词,从给出的字典中找出这些单词的Anigram。 第1行:1个数N,表示字典中单词的数量。(1 <= N <= 10000) 第2 - N + 1行,字典中的单词,单词长度 <= 10。 第N + 2行:查询的数量Q。(1 <原创 2017-05-29 22:37:26 · 687 阅读 · 0 评论 -
【51Nod】1002 数塔取数问题
题意一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。 每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。 —-5—- —8-4— –3-6-9– -7-2-9-5- 例子中的最优方案是:5 + 8 + 6 + 9 = 28解题思路贪心,从下往上找,先求出每个位置能得到的最大值,再向上传递。 dp[i][j]表示第i行第j列能取数之和原创 2017-04-27 16:50:16 · 1105 阅读 · 0 评论 -
【51Nod】1001 数组中和等于K的数对
题意给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对。例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9),(0,8),(2,6),(3,5)。解题思路先将A进行排序,我们对A中的每个元素查找对应的数对时,可以采用二分查找,因为是顺序排列了。 剪枝:当A中的元素值的两倍大于等于K时,不用继续查找了。参考代码原创 2017-04-27 16:34:54 · 735 阅读 · 0 评论 -
【51Nod】1090 3个数和为0
题意给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。解题思路将数组从小到大排序,遍历前两个数,最后一个数采用二分查找。参考代码#include <iostream>#include <algorithm原创 2017-05-18 11:25:03 · 699 阅读 · 0 评论 -
【51Nod】1087 1 10 100 1000
题意1,10,100,1000…组成序列1101001000…,求这个序列的第N位是0还是1。解题思路对于1的位置,我们可以得到序列 1,2,4,7,11,16,… 观察发现 1=1 2=1+1 4=1+1+2 7=1+1+2+3 11=1+1+2+3+4 … 我们可以得到推导公式a[n]=1+n*(n-1)/2; 所以,当输入的N是a[]序列的值时,输出为1,否则为0 逆向求原创 2017-05-18 11:05:08 · 759 阅读 · 0 评论 -
【51Nod】1083 矩阵取数问题
题意一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。 例如:3 * 3的方格。1 3 3 2 1 3 2 2 1能够获得的最大价值为:11。解题思路dp[i][j]:从左上走到第i行第j列能够获得的最大价值 状态转移方程为:dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];参考代原创 2017-05-18 10:39:36 · 765 阅读 · 0 评论