2019.08.07【NOIP提高组】模拟 A 组 总结

题目

[jzoj 6275]【NOIP提高组模拟1】小L的数列 {矩阵乘法}

[jzoj 6274] 【NOIP提高组模拟1】梦境 {贪心/优先队列}

[jzoj 6276] 【noip提高组模拟1】树 {扫描线+线段树}


比赛时一看第一题就觉得时矩阵乘法,结果一打出来发现这些递推式时指数相加,顿时不知所措,交了一个40分暴力。
第二道题目很像贪心,但是我无法证明正确性,总是相信有我没有想到的反例。 于是就打了一个比较稳妥的二分图匹配的 O ( n 3 ) O(n^3) O(n3)的暴力。
不知道是没有拆点,又是什么原因,爆零了。
第三题,没有细想。

比赛程序

T2 0分

#include
#include
#include
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
#define ll long long
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std; 
const int N=205; 
const long long p=998244353;
int n,k; ll f[N][N],a[N][N],c[N][N]; 
ll tksm(ll x,ll y){
	ll ans=1; 
	for(;y;y>>=1,x=(x*x)%p) if (y&1) ans=(x*ans)%p; 
	return ans; 
}
void ksm(){
	memset(c,0,sizeof(c)); 
	rep(i,1,k) rep(j,1,k) rep(q,1,k) c[i][j]=(c[i][j]+f[i][q]%p*f[q][j]%p)%p; 
	memcpy(f,c,sizeof(f)); 
}
void ksmm(){
	memset(c,0,sizeof(c));
	rep(i,1,k) rep(j,1,k) rep(q,1,k) if (i!=k) c[i][j]=(c[i][j]+a[i][q]%p*f[q][j]%p)%p;
	else c[i][j]=(c[i][j]+tksm(a[i][q],f[q][j]))%p;
	memcpy(a,c,sizeof(a));
}
void get()
int main(){
	scanf("%d%d",&n,&k);
	rep(i,1,k-1) f[i+1][i]=1;
	rep(i,1,k) scanf("%lld",&f[k-i+1][k]); 
	rep(i,1,k) scanf("%lld",&a[1][i]); 
	return printf("%lld",(n>k)?(get(n-k)):a[1][n]); 
}

你可能感兴趣的:(杂文/总结)