发个题目坑 二模03day1

1.数列(seq2.pas/c/cpp)

题目描述

一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7。给定 A,B 和 n 的值,要求计算 f(n)的值。

输入格式

仅一行包含 3 个整数 A,B 和 n,其中(1≤ A, B ≤1000, 1 ≤n≤100,000,000)。

输出格式

仅一行,一个整数,即 f(n)的值。

输入输出样例

input:                 |  output:-----------------------------------1 1 3                  |  2-----------------------------------1 2 10                 |  5

分析

这是一道比较有意思的题目,虽然比较水,AC算法也不是每人都能想到的啦啦啦.

首先看到输出的数据范围,非常小对不对!$0\le f(n)\le 6$.然后研究这个递推数列的性质.它是一个线性递推数列,也就是可以用矩阵快速幂做.但是这样还是太麻烦了呢.

注意到这个数列像极了Fibonacci数列,嗯,让我们称它为"Coefficient Extended Fibonacci Sequence of Natural Numbers",附个简称叫CEFSNN.虽然这没什么用啊...也是装逼利器对不~

把求f(n)的表达式换一个写法会怎么样呢?

f(n)=((A*f(n-1))mod 7+(B*f(n-2))mod 7)mod 7

然后A,B都是常量嗯.

那么因为 A*f(n-1)mod 7=(A mod 7)*(f(n-1)mod 7)mod 7 嗯,B...同理

A mod 7 也是常量吖.

那么设两个数$x,y \in \mathbb{N}$,只要$f(x)\equiv f(y) \pmod{7}$且$f(x+1)\equiv f(y+1) \pmod{7}$则x与y之间就是一个循环节.

因为前后两个数排列最多49种,寻找循环节长度不会超过49.(如果超过根据鸽笼原理可知肯定有一个更小的循环节,且有一个显然的结论即是若a和b都可作为循环节长度,则gcd(a,b)也可以.扯远了)

这题正解应该就是这个了.

当然有兴趣试试Matrix Multiplication哈.

代码

因为逗逼的po主是先写题解再写题目的所以...(不拿代码讲算法都是耍流氓!!)哎别打我!!我写个不成吗?

#include "cstdio"
int a,b,n,i,p,f[60];
bool h[80];
int main(){
	freopen("seq2.in","r",stdin);
	freopen("seq2.out","w",stdout);
	scanf("%d%d%d",&a,&b,&n);
	a%=7;
	b%=7;
	f[1]=f[2]=1;
	h[9]=true;
	for(i=3;i<52;++i){
		f[i]=(a*f[i-1]+b*f[i-2])%7;
		if(n==i){
			printf("%d\n",f[i]);
			return 0;
		}
		if(h[f[i]*8+f[i-1]]){
			p=i-2;
			break;
		}else{
			h[f[i]*8+f[i-1]]=true;
		}
	}
	printf("%d\n", f[(n-1)%p+1]);
	return 0;
}

2.最长路(path.pas/c/cpp)

题目描述

设 G 为有 n 个顶点的有向无环图,G 中各顶点的编号为 1 到 n,且当<i,j>为 G 中的一条边时有i < j。设 w(i,j)为边<i,j>的长度,请设计算法,计算图 G 中<1,n>间的最长路径。

输入数据

第一行有两个整数 n 和 m,表示有 n 个顶点和 m 条边,其中(2≤n≤1500,m≤50000),接下来 m 行中每行输入 3 个整数 a ,b,v 表示从 a 点到 b 点有条边,边的长度为 v。

输出数据

一个整数,即 1 到 n 之间的最长路径.如果 1 到 n 之间没连通,输出-1。

输入输出样例

input:                 |  output:-----------------------------------2 1                    |1 2 1                  |  2

题解

良心傻逼题.因为是有向无环图,SFPA大胆做.注意判断连通性和是求最长路.

代码

话说这是一次通过的节奏?但要是我连SPFA都写错我还怎么有脸混OI界?

#include <cstdio>
int next[70000],to[70000],hl,head[3000],le[70000];
inline void addEdge(int f,int t,int v){
	++hl;
	next[hl]=head[f];
	to[hl]=t;
	le[hl]=v;
	head[f]=hl;
}
int i,j,k,l,a,b,c,m,n;
int qh,qt,q[600000],f[3000];
bool iq[3000],vis[3000];
void spfa(){
	vis[1]=iq[1]=true;
	qt=2;
	qh=1;
	q[1]=1;
	while(qh!=qt){
		i=q[qh];
		iq[i]=false;
		for(j=head[i];j!=0;j=next[j]){
			vis[k=to[j]]=true;
			l=le[j];
			if(f[i]+l>f[k]){
				f[k]=f[i]+l;
				if(!iq[i]){
					iq[i]=true;
					q[qt++]=k;
				}
			}
		}
		++qh;
	}
}
int main(int argc, char const *argv[]){
	freopen("path.in","r",stdin);
	freopen("path.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=0;i<m;++i){
		scanf("%d%d%d",&a,&b,&c);
		addEdge(a,b,c);
	}
	spfa();
	if(!vis[n]){
		printf("-1\n");
	}else{
		printf("%d\n", f[n]);
	}
	return 0;
}
时间: 2024-10-13 10:05:52

发个题目坑 二模03day1的相关文章

二模 (8) day2

第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得到相应得分.现在要你引爆 k 个炸弹,使得得分最大. 解题过程: 1.一开始想到算出每个入度为0的点打掉之后的得分,然后做个堆,从大到小打,但是路径会有重叠的情况,也就是说打掉一条路径后可能会导致另外一条路径的权值发生变化.. 2.然后听到YYL大神一直在说2次BFS,就想到可以倒着来做..从出度为

数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)

本文出自:http://blog.csdn.net/svitter 题目12:计算机学院学生会的打印机(优先队列) 小明抱怨学生会的打印机不符合FIFO的原则,看到很多在他后面来打印的同学比他先打印出来.五分钟前,小明的文件就是下一个候选的,如今小明的文件又排到了后面.学生会的同学给小明解释说,学生会的打印机不是採用传统的队列方式,而是採用一种自定义的优先队列方式:每一个要打印的文件被赋予了一个从1到9的优先级(9最高,1最低).打印规定例如以下: 将队列中要打印的文件f从队列中拿出来: 假设在

boost::asio async_write也不能保证一次发完所有数据 二

只有看boost源码才能弄明白发生了什么.首先我是将vector里面写入了数据,然后用boost::asio::buffer将vector构造成了mutable_buffer_1对象. 参考该文档的重载形式:http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/buffer/overload24.html [cpp] view plaincopyprint? buffer (24 of 28 overloads) C

动态规划题目(二)——跳台阶

动态规划题目(二)--跳台阶 1. 题目描述 一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级. 求总共有多少总跳法,并分析算法的时间复杂度. 2. 递归方式 对于这个动态规划问题,我们一样分两步来想: 假如我们跳了1级,那么剩下的跳法就是f(n-1): 假如我们跳了2级,那么剩下的跳法就是f(n-2): 这个时候我们就可以递归实现了,慢!我们还需要跳出递归的条件,这个也是必不可少的! 这个题目而言,跳出递归的条件是当n==1, 2的时候,我们返回1, 2. 为什么是1,2呢?因为当n

python基础04/基础数据类型补充/以后会遇到的坑/二次编码

python基础04 内容大纲 基础数据类型补充 以后会遇到的坑 二次编码 1.基础数据类型补充 1.1 字符串(str) str: 不可变 1.1 首字母大写: # name = "alex" # name1 = name.capitalize() # print(name1) 1.2 每个单词首字母大写 # name = "alex wusir" # print(name.title()) 1.3 大小写反转 # name = "Alex"

PMP备考资料 | 2019/2020年PMP全真模拟题 、一模、二模、三模试题 | PMP章节练习题 | 附带详细答案解析 --- 项目整合管理 等(PMBOK&#174;第六版)

PMP备考资料 | 2019/2020年PMP全真模拟题 .一模.二模.三模试题 | PMP章节练习题 | 附带详细答案解析 --- 项目整合管理 等(PMBOK®第六版),获取:http://t.cn/A6POWgMw 原文地址:https://www.cnblogs.com/chunlynn/p/12252179.html

二模 06day2

很长时间没更新有意义的题目了呢,这是一套题撒,于是乎我便开心的边刷题边发题解了撒. 第一题: interval 比较好玩的一题撒, 分分钟过了, 就是模拟贪吃蛇但是没有食物(嗯,只要你判断冲突). 整个数组拿来移当然是不行的撒, 只要在末尾移去一个方格再向头部正对出放一个方格就行了撒. 编程复杂度挺低的, 可以直接修改一下做贪吃蛇游戏的后台. (最坑的地方就是坐标系.无图无**) 其实也不算很坑啦. #include <cstdio> #include <cstring> stru

二模 (12)day1

第一题: 题目大意: 有N颗糖,两个人轮流取,每次只能取质数颗,不能取的输.求先取者若必胜,最少需要多少步胜利.(N<=10000) 解题过程: 1.看到N的范围比较小,先打个素数表,然后dp即可. 2.F[i]表示i颗糖,先取的人若必胜,最少要多少步胜利,若必败,最多多少步失败.如果i减去一个质数可以达到一个必败态,那么必胜,反之必败. 初始得分80,数据坑爹,说小于10000的,却有20000的数据. 第二题: 题目大意: 有一种虫子,长度为X的时候,一天后会分裂成长度为X-1,X+1的2只

二模 (9) day2

第一题: 题目大意:求满足条件P的N位二进制数的个数.P:该二进制数有至少3个0或者3个1挨在一起.. N<=20000 解题过程: 1.一开始直接写了个dfs把表打了出来,不过没发现什么规律,然后就尝试着反过来想,先求出不满足条件P的个数,然后总个数减一下.然后就把2^N-ans输了出来,结果发现是个斐波那契数列.(打表大法好啊) 2.如果直接写高精度是要超时并且爆空间的..所以要用滚动数组并且万进制优化(实际上我用了16位数字压成一个long long),貌似20000的数据万进制还是太慢.