多校10 1002 HDU 6172 Array Challenge

题意

There’s an array that is generated by following rule.

\(h_0=2,h_1=3,h_2=6,h_n=4h_{n-1}+17h_{n-2}-12h_{n-3}-16\)

And let us define two arrays bnandan as below.

\(
b_n=3h_{n+1} h_n+9h_{n+1} h_{n-1}+9h_n^2+27h_n h_{n-1}-18h_{n+1}-126h_n-81h_{n-1}+192(n>0)
\)

\(
a_n=b_n+4^n
\)

Now, you have to print \(\left \lfloor \sqrt{a_n} \right \rfloor\) , n>1.

Your answer could be very large so print the answer modular 1000000007.

题解

首先要打表,然后就可以:

方法1,找规律:

令\(f_n=\left \lfloor \sqrt{a_n} \right \rfloor\),打表出来,发现接近7倍关系,再打出 \(7f_{n-1}-f_{n}\),会发现是\(f_{n-2}\)的4倍,所以\(f_n=7f_{n-1}-4f_{n-2}\)。再用矩阵快速幂。注意取模有负数。

方法2,猜:

前几项和h的前几项差不多,于是模仿h的递推式,\(f_n=4f_{n-1}+17f_{n-2}-12f_{n-3}\),刚好符合。

方法3,BM算法:

如果递推式是线性的,就把前几项带进去就可以得到递推式。

具体算法介绍建议看这个:Berlekamp–Massey algorithm(From Wikipedia)

"Shift-register synthesis and BCH decoding"

方法4,数学递推,我不会。

代码

#include <cstdio>
#include <map>
#include <cstdlib>
#include <queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,l,r) for (int i=l;i<r;++i)
typedef unsigned long long ull;
int dx[4]={1,1,-1,-1},dy[4]={0,1,0,-1};
map<ull,bool>vis;
struct Sta{
int a[6][6],step,x,y;
Sta(){step=x=y=0;}
};
int gujia(Sta s){
int ans=0;
rep(i,0,6)rep(j,0,i+1)
if(s.a[i][j])ans+=abs(s.a[i][j]-i);
return ans;
}
ull haxi(Sta s){
ull ans=0;
rep(i,0,6)rep(j,0,i+1){
ans<<=3;ans|=s.a[i][j];
}
return ans;
}
int bfs(Sta s){
vis.clear();
queue<Sta>q;q.push(s);
while(!q.empty()){
Sta now=q.front();q.pop();
if(gujia(now)==0)return now.step;
rep(i,0,4){
int x=now.x,y=now.y;
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<6 && ny>=0 && ny<=nx){
swap(now.a[x][y],now.a[nx][ny]);
now.x=nx,now.y=ny,++now.step;
ull hx=haxi(now);
if(!vis[hx]&&gujia(now)+now.step<21){
q.push(now);
vis[hx]=true;
}
swap(now.a[x][y],now.a[nx][ny]);
now.x-=dx[i],now.y-=dy[i],--now.step;
}
}
}
return -1;
}
int main() {
int t;
scanf("%d",&t);
while(t--){
Sta s;
rep(i,0,6)
rep(j,0,i+1){
scanf("%d",&s.a[i][j]);
if(s.a[i][j]==0)s.x=i,s.y=j;
}
int ans=bfs(s);
if(ans==-1)puts("too difficult");else printf("%d\n",ans);
}
return 0;
}
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
const ll mod=1000000007;
ll qpow(ll a,ll b) {ll res=1;for(a%=mod;b;b>>=1,a=a*a%mod)if(b&1)res=res*a%mod;return res;}
VI BM(VI s) {//c[0]s[0]+c[1]s[1]+...=0
VI C(1,1),B(1,1);
int L=0,m=1,rev=1;
rep(n,0,SZ(s)) {
ll d=0;
rep(i,0,L+1) d=(d+(ll)C[i]*s[n-i])%mod;
if (d==0) ++m;
else if (2*L<=n) {
VI T=C;
ll c=mod-d*rev%mod;
C.resize(SZ(B)+m);
rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
L=n+1-L; B=T; rev=qpow(d,mod-2); m=1;
} else {
ll c=mod-d*rev%mod;
C.resize(SZ(B)+m);
rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
++m;
}
}
rep(i,0,SZ(C))printf("%dx[%d]%s",C[i],i,i+1==SZ(C)?"=0\n":"+");
return C;
}
调用:BM(VI{31,197,1255,7997})

【hdu 6172】Array Challenge(数列、找规律)的更多相关文章

  1. 2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6172 题意:如题. 解法: #include <bits/stdc++.h> using ...

  2. HDU - 6172:Array Challenge (BM线性递推)

    题意:给出,三个函数,h,b,a,然后T次询问,每次给出n,求sqrt(an); 思路:不会推,但是感觉a应该是线性的,这个时候我们就可以用BM线性递推,自己求出前几项,然后放到模板里,就可以求了. ...

  3. HDU 3032 multi-sg 打表找规律

    普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...

  4. CodeForces 450B Jzzhu and Sequences 费波纳茨数列+找规律+负数MOD

    题目:Click here 题意:给定数列满足求f(n)mod(1e9+7). 分析:规律题,找规律,特别注意负数取mod. #include <iostream> #include &l ...

  5. hdu 1030 Delta-wave(数学题+找规律)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1030 Delta-wave Time Limit: 2000/1000 MS (Java/Others ...

  6. HDU 5703 Desert 水题 找规律

    已知有n个单位的水,问有几种方式把这些水喝完,每天至少喝1个单位的水,而且每天喝的水的单位为整数.看上去挺复杂要跑循环,但其实上,列举几种情况之后就会发现是找规律的题了= =都是2的n-1次方,而且这 ...

  7. HDU 4910 Problem about GCD 找规律+大素数判断+分解因子

    Problem about GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. HDU 4572 Bottles Arrangement(找规律,仔细读题)

    题目 //找规律,123321123321123321…发现这样排列恰好可以错开 // 其中注意题中数据范围: M是行,N是列,3 <= N < 2×M //则猜测:m,m,m-1,m-1 ...

  9. HDU 1041 Computer Transformation(找规律加大数乘)

    主要还是找规律,然后大数相乘 #include<stdio.h> #include<string.h> #include<math.h> #include<t ...

  10. HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)

    A Boring Question Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

随机推荐

  1. getQueryStringByName url参数/

    MasterId: (masterIdUrl != null && masterIdUrl != "") ? masterIdUrl : null ClassId: ...

  2. AtCoder Beginner Contest 116 D - Various Sushi (贪心+栈)

    D - Various Sushi Time Limit: 2 sec / Memory Limit: 1024 MB Score : 400400 points Problem Statement ...

  3. Array and Segments (Easy version) CodeForces - 1108E1 (暴力枚举)

    The only difference between easy and hard versions is a number of elements in the array. You are giv ...

  4. 解决jenkins运行磁盘满的问题

    解决jenkins运行磁盘满的问题 - ling811的专栏 - CSDN博客 https://blog.csdn.net/ling811/article/details/74991899 1.自动丢 ...

  5. Javascript与C#对变量的处理方式

      先来看一下Javascript的情况(下面所说的基本类型和简单类型是一个意思): Javascript中变量会存在两种情况,一种是基本类型的,一共有五种,有null.Bollean.undefin ...

  6. 通过event记录sql

    providers EventServiceProvider.php 添加 protected $listen = [ 'Illuminate\Database\Events\QueryExecute ...

  7. spring-01

    Spring概述 概述 Spring是一个开源框架 为企业级开发而生 是一个IOC[DI]和AOP容器框架 有许多优良特性 非侵入式:基于Spring开发的应用中的对象可以不依赖Spring的API. ...

  8. wireshark抓包获取好友ip,定位所在位置

    1.打开wireshark 2.按Ctrl + F 键进行搜索 1,选择搜索 “字符串”; 2,选择搜索 “分组详情”; 3,填写搜索数据 “020048″; 3.对qq好友发起语言或视频通话(需要对 ...

  9. 错误模块名称: KERNELBASE.dll

    部署win服务时,经常会出现类似下面的错误,错误模块名称: KERNELBASE.dll. 日志名称:          Application 来源:            Application ...

  10. Delphi之TComponent类

    TComponent类 TComponent类直接由TPersistent派生.TComponent的独特特征是它的属性能够在设计期间通过ObjectInspector来控制,能够拥有其他组件.非可视 ...