NYOJ 998】的更多相关文章

这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pkak为正整数n的素数幂分解,那么φ(n) = n·(1-1/p1)·(1-1/p2)·(1-1/p3)···(1-1/pk) 2.如果n是质数,则φ(n) = n-1;  反之,如果p是一个正整数且满足φ(p)=p-1,那么p是素数. 3.设n是一个大于2 的正整数,则φ(n)是偶数 4.当n为奇数…
在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记euler(x)公式能计算小于等于x的并且和x互质的数的个数:我们再看一下如何求小于等于n的和n互质的数的和, 我们用sum(n)表示: 定理:若gcd(x, a)=1,则有gcd(x, x-a)=1: 证明:假设gcd(x, x-a)=k (k>1),那么有(x-a)%k=0---1式,x%k=0---2…
http://www.cppblog.com/RyanWang/archive/2009/07/19/90512.aspx?opt=admin 欧拉函数 E(x)表示比x小的且与x互质的正整数的个数.*若p是素数,E(p)=p-1.*E(pk)=pk-pk-1=(p-1)*pk-1证:令n=pk,小于n的正整数数共有n-1即(pk-1)个,其中与p不质的数共[pk-1-1]个(分别为1*p,2*p,3*p...p(pk-1-1)).所以E(pk)=(pk-1)-(pk-1-1)=pk-pk-1.…
/* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个 有向图的欧拉回路:所有的节点都有In[i]==Out[i] */ #include<iostream> #include<cstring> #include<cstdio> #include<…
整整两天了,都打不开网页,是不是我提交的次数太多了? nyoj 10: #include<stdio.h> #include<string.h> ][],b[][]; int X,Y; int maxx(int a,int b) { return a>b?a:b; } int max(int a,int b,int c,int d) { return maxx(maxx(a,b),maxx(c,d)); } int kkk(int x,int y,int c) { ||y==…
例题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=138 代码目的:复习哈希用 代码实现: #include "stdio.h" //nyoj 138 简单哈希 #include "vector" using namespace std; #define N 100007 vector<int> a[N]; //vector向量处理冲突 void ADD() { int m,k; scanf(&q…
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少需要多少时间. 思路:简单广搜~ 代码如下: #include "stdio.h" //nyoj 284 坦克大战 简单搜索 #include "string.h" #include "queue" using namespace std; #def…
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=170 思路:统计每个节点的度,将度为1的节点消去所需要的最少的边即为答案. 代码: #include "stdio.h" //nyoj 170 网络的可靠性 #include "string.h" #define N 10005 int du[N]; int main() { int n; int i; int x,y; while(scanf("…
我排第几个 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? 输入 第一行有一个整数n(0<n<=10000); 随后有n行,每行是一个排列: 输出 输出一个整数m,占一行,m表示排列是第几位: 样例输入 3 abcdefghijkl hgebkflacdji gfkedhjblcia 样例输出 1 302715242…
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5] 解题过程: 1将每一个区间按照左端点递增顺序排列,拍完序后为[1,4],[2,4],[2,6],[3,5],[3,6],[3,7],[6,8] 2设置一个变量表示已经覆盖到的区域.再剩下的线段中找出所有左端点小于等于当前已经覆盖到的区…
一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm.求最大的m值.   二,算法:动态规划法:O(n^2) 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj…
NYOJ 239:http://acm.nyist.net/JudgeOnline/problem.php?pid=239 ural 1109 :http://acm.timus.ru/problem.aspx?space=1&num=1109 NYOJ 月老的难题,是裸的最大匹配,很烦的是邻接阵超时.改用邻接表. #include <bits/stdc++.h> using namespace std; #define maxn 1005 vector <int> G[m…
题目链接:nyoj 28 就是个简单的高精度,只是一开始我打表超内存了,然后用了各种技巧硬是把内存缩到了题目要求以下(5w+kb),感觉挺爽的,代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; ; const int mod = 1e6; ][], len[M + ];…
51 Nod http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 Manacher 算法 定义数组 p[i]表示以i为中心的(包含i个这个字符)回文串半径长. 将字符串s从前扫到后,来计算p[i] , 则最大的p[i]就是最长回文串长度 , 由于s是从前扫描到最后的,所以需要计算p[i]时一定计算好了 p[1]~~p[i-1] 假设现在扫描到了i+k这个位置,现在需要计算p[i+k] 定义maxlen是位置i+k位…
点击打开链接 Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7810   Accepted: 4261 Description Background  Raymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instan…
package nyoj; import java.util.Scanner; public class Main { public static void main(String args[]) { //System.out.println(Integer.MAX_VALUE); Scanner scn=new Scanner(System.in); int len=scn.nextInt(); while(len-->0) { int v=scn.nextInt(); int e=scn.n…
描述 计算n!的十进制表示最后有多少个0 输入 第一行输入一个整数N表示测试数据的组数(1<=N<=100)每组测试数据占一行,都只有一个整数M(0<=M<=10000000) 输出 输出M的阶乘的十进制表示中最后0的个数比如5!=120则最后的0的个数为1 样例输入 6 3 60 100 1024 23456 8735373 分析: http://www.cnblogs.com/hansongjiang/archive/2014/05/06.html 0来源于2*5,且将N!中分…
#include <iostream> using namespace std; int main() { int i,t,n; int a[101]; cin>>t; while(t--) { cin>>n; if(n==1) cout<<"0"<<endl; else{ a[2]=1;a[3]=2; for(i=4;i<=n;i++) a[i]=a[i-1]+a[i-2]; cout<<a[n]<&…
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> using namespace std; int f[1000]; int digree[1000]; int find(int x) { while(x!=f[x]) x=find(f[x]); return x; } void bing(int a,int b) { if(find(a)!=find…
#include <iostream> using namespace std; int main() { int a[51][51],b[51][51],c[51][51],i,j,k,l,m,n; while(cin>>m>>n>>k,m+n+k>0) { for(i=1;i<=m;i++) for(j=1;j<=n;j++) cin>>a[i][j];//flag[j][i]=a[i][j];} for(i=1;i<…
//nyoj 214 这个题目和字符串的问题类似,都是给出一组数据,寻找最长的单调递增字符 这一题一开始我用dp做,发现超时,看了下时间,n*n的复杂度,换过一种思路 用类似于栈的方式,来存储每次更新过后的单调序列,里面二分查找很容易理解 就是数组作用开始比较难理解,大致思路是先把输入数组的第一个元素放入Stack数组里 然后一个for,从第二个元素开始,if每次判断和top顶元素大小,逐次叠加上递增的序列 如果不满足,用二分法查找到a[i]应该放在Stack数组的适合位置 这个适合位置就是St…
//这一题是  nyoj 36  是一道求最长公共子序列的题,也是用dp做出来的 核心代码也就是一句,题目大概思路是先找到两组字符串里面相同的字母 在二维数组里面更新每次比较过后dp的值,空想很难理解,自己在纸上画画就知道了 实在不行就把那段代码记下来... 还有我一直都不明白为什么我把dp数组放在主函数和while里面 编译不过,而且我一直都怀疑二维数组没赋初值,可以显示初始值,那还要memset干嘛呢.... #include <iostream> #include <string.…
// nyoj 17        代码如上,用的是dp,总的来说就是对一个字符串 从末尾开始比较,设定一个数组,存放每个单调字串的最大长度,最后比较... //要注意的就是里面if语句对于每次字符比较后,更新数组,自己在纸上画画就清楚了... #include <iostream> #include <string.h> using namespace std; int main() { int i,j,len,dp[100]; char a[100]; cin>>a…
//nyoj 44 //和上面一题一样,求子串和,但是代码非常简洁..... 时间复杂度为n #include <iostream> using namespace std; int main() { int i,t,n,first,later; cin>>t; while(t--) { cin>>n>>first; int Max=first; for(i=2;i<=n;i++) { cin>>later; if(first>0)…
//nyoj  37 代码有点乱,和最长公共子序列很像,只是多加了一个数组,之前调用函数, 一直超时,可是我看了下,为什么用一个整形数组存放倒置字符串 竟然可以AC,我测试了下数据,打印出来的是一串地址,为什么为什么为什么啊.... #include <iostream> #include <string.h> #define Max(a,b) a>b?a:b using namespace std; int dp[1001][1001]; int main() { int…
题目地址:pid=46">NYOJ 46 思路:能够化成二进制来求解.结果是最高位的位数-1+最高位后面1的个数.比如:对于3.它的二进制代码为11,就是用这个最高位(2-1)加上后面的1的个数(1个). 用最高位1的目的是他能代表了转化的次数,由于2+2=4,4+4=8 8+8=16........ #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.…
题目: http://ac.jobdu.com/problem.php?pid=1481 http://acm.nyist.net/JudgeOnline/problem.php?pid=129 http://poj.org/problem?id=1308 http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目意思就是判断一些给定的支点构成的树是不是一颗合法的树, 判断是不是一颗合法的树如下: 1.该树只有一个根节点 2.不存在环 对于上述两种情况采用…
题目:nyoj——138 /*** 哈希求解...采用链表保存 插入时,可以去除重复 查找 找到该组,然后在改组的查找 当这个组不存在时或是没有找到时是 NO 其他是YES 1e6+1 时间最短 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 1000001; typedef struct numb { int a; numb *next; }numb; numb *head…
AC_mm玩dota 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 大家都知道AC_mm比较喜欢玩游戏,特别是擅长war3这款经典游戏.某天AC_mm来到了VS平台上 ,准备去虐菜鸟,正巧一个不小心将我们ACM队长虐了 ^_^,我们的队长这下可不高兴了,说要出一道难题让AC_mm难堪一下.题目描述是这样的,给一个正整数n,n在二进制表示的情况下(不含前导0和符号位)有a个1和b个0,求斐波拉契数列的第a*b项对1314520取模后的值ans. 注意(斐波拉契数列:…
题意就不说了,中文题... 小白上讲了棋盘覆盖,于是我就挖了这题来做. 棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下. 公式就是f(k) = f(k - 1) * 4 + 1,再化解下就是4^0 + 4^1 + 4^2 + ... + 4^(n-1). 思路很简单,但是题目没想象中的简单,刚开始天真的用递归模拟了下就交上去,立马wa掉... 发现即使用Long long类型,n到32就挂了 +_+... 于是实在不是很懂,难道一定要用高精度吗?贵了好久,最后只得找到一篇题解来理解…