前言:
接近放弃的边缘。。。。。
有些板子题居然还是不会做(就算会了,但是还是只会板子题,稍微变形又不会做了,害)
最近期末考又来了,这一学期感觉好多科目都好划水啊(然鹅ACM水平还是没有看到有很大的变化),立个flag:这个寒假996的刷题模式给我等着!!!
这题我人都傻了,斐波拉契这个规律我居然不知道。。。。
看完题解我才知道
1、前n项和=第n项*第(n+1)项
具体解释看这篇博客:https://blog.csdn.net/lanchunhui/article/details/51840616
2、当我觉得知道这个规律之后就万事大吉了时:暴力写个循环,然后继续看题解:我的天,矩阵快速幂、吓得我马上把我的矩阵快速幂模板拿来,
好,虽然有份模板,但是从来没有做过矩阵快速幂的题(用都不知道怎么用)
于是又看了这篇博客:
https://blog.csdn.net/wust_zzwh/article/details/52058209###
讲的也太好了吧,至于模板感觉还是按照自己的编码习惯可以稍加修改
#include
#include
#include
#include
#include
#define mod(x) (x%MOD)
#define MOD 1000000007
#define ll long long
using namespace std;
struct mat{
ll m[2][2];
}unit;
//重载乘法运算符
mat operator * (mat a,mat &b){
mat ret;
memset(ret.m,0,sizeof(ret.m));
for(int k=0;k<2;k++){
for(int i=0;i<2;i++){
if(a.m[i][k]){
for(int j=0;j<2;j++){
ret.m[i][j]=mod(ret.m[i][j]+(ll)a.m[i][k]*b.m[k][j]);
}
}
}
}
return ret;
}
//单位矩阵初始化
void init_unit(){
for(int i=0;i<2;i++){
unit.m[i][i]=1;
}
return ;
}
//矩阵快速幂
mat pow_mat(mat a,ll n){
mat ret=unit;
while(n){
if(n&1){
ret=ret*a;
}
n>>=1;
a=a*a;
}
return ret;
}
int main(){
init_unit(); //这个非常重要
mat real;
real.m[0][0]=1;
real.m[0][1]=0;
real.m[1][0]=1;
real.m[1][1]=0;
mat temp;
temp.m[0][0]=1;
temp.m[0][1]=1;
temp.m[1][0]=1;
temp.m[1][1]=0;
ll n;
cin>>n;
if(n==1){
cout<<1<<endl;
}
else{
mat ans1=pow_mat(temp,n-2)*real;
mat ans2=pow_mat(temp,n-1)*real;
cout<<mod(ans1.m[0][0]*ans2.m[0][0])<<endl;
}
return 0;
}
模板我参照的以前的一份模板:https://blog.csdn.net/f_zyj/article/details/52202169
于是便有了下面的代码:
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
int main(){
ll a,b;
cin>>a>>b;
if(a<b){
swap(a,b);
}
cout<<max(a/3,b/2);
return 0;
}
比赛的时候,硬是找不到哪里错了,我也是佛了
标程是下面的亚子:
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
int main(){
ll a,b;
cin>>a>>b;
if(a<b){
swap(a,b);
}
cout<<max(min(a/3,b),b/2);
return 0;
}
害!!!!
裸的线段树、但是还是没做出来,那个lazy标记到现在感觉还是迷迷糊糊的。。。
很无语,看着大数,我才懒得用C++搞个大数模板敲呢,于是开始用Java
但是未能领悟到Java的精髓,好多封装的方法都不知道用,导致一交就wa了,人都傻了
看了题解后发现:好吧,Java nb!
import java.math.BigInteger;
import java.util.*;
public class Main{
public static void main(String args[]) {
Scanner scan=new Scanner(System.in);
String str=scan.next();
int a=scan.nextInt();
int b=scan.nextInt();
//a进制数转为b进制数
String res=new BigInteger(str,a).toString(b);
System.out.println(res);
}
}
一看就感觉是dfs啊,但是不知道比赛的时候为啥,dfs没过,导致我心态很崩,但是刚刚又写了一个dfs的代码,一交居然过了。。。。
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int dirx[]={0,-1,-2,-2,-1,1,2,2,1};
int diry[]={0,-2,-1,1,2,2,1,-1,-2};
int mp[2010][2010];
int n,m;
int cnt;
void dfs(int x,int y){
cnt++;
mp[x][y]=1;
for(int i=1;i<=8;i++){
int fx=x+dirx[i];
int fy=y+diry[i];
if(fx>=1&&fx<=n&&fy>=1&&fy<=m&&mp[fx][fy]==0){
dfs(fx,fy);
}
}
}
int main(){
memset(mp,0,sizeof(mp));
cin>>n>>m;
cnt=0;
dfs(1,1);
if(cnt==n*m){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
看了看题解,居然还是一道考思维的题,具体见代码:
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int main(){
int n,m;
cin>>n>>m;
if((n>=3&&m>=3&&(n+m!=6))||(n==1&&m==1)){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
return 0;
}
也是佛了,这个签到题。。。
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
ll a[1010];
int main(){
int n,m,k,x;
cin>>n>>m>>k;
for(int i=1;i<+n;i++){
cin>>x;
}
cout<<"I Love nowcoder"<<endl;
return 0;
}
感觉还是学到了矩阵快速幂、Java对于大数的骚操作、线段树的lazy标记继续回炉,明天康康J的数位dp