执意为我的故事抹|

Star_LIcsAy

园龄:3年粉丝:3关注:1

2022-08-25 20:03阅读: 36评论: 0推荐: 0

2022/8/25 总结

A.幸福

  • 考场上没想起矩阵,写了个 O(n) 的暴力,得 70pts

Solution

  • 矩阵乘法。对 Fn 进行化简,就可以化得一个式子: Fn=Fn1+Fn2+fn,其中 fn 表示斐波那契数列的第 n 项。

  • 然而这样还是不能求和。
    解决方案为将 sum 也放进矩阵里。
    于是设计答案矩阵构成为 [sumnFnFn1fn+1fn],则每次转移时将 Fn+1 算出再累加到 sumn 中,即可得到 sumn+1

  • 与这个矩阵对应的转移矩阵为:
    [1000011100110001101100010]

AC 矩阵乘法
#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int mod=998244353;

struct memr{
	ll x[10][10];
	int a,b;
	memr operator*(const memr &_)const{
		memr cnt;
		memset(cnt.x,0,sizeof(cnt.x));
		cnt.a=a,cnt.b=_.b;
		for(int i=1;i<=a;++i)
			for(int j=1;j<=_.b;++j)
				for(int k=1;k<=b;++k)
					(cnt.x[i][j]+=1ll*x[i][k]*_.x[k][j]%mod)%=mod;
		return cnt;
	}
};

memr ksm(ll y){
	memr dx;
	dx.a=dx.b=5;
	memset(dx.x,0,sizeof(dx.x));
	dx.x[1][1]=dx.x[2][1]=dx.x[3][1]=dx.x[4][1]=1;
	dx.x[2][2]=dx.x[3][2]=dx.x[4][2]=1;
	dx.x[2][3]=dx.x[4][4]=dx.x[4][5]=dx.x[5][4]=1;
	memr cnt;
	cnt.a=cnt.b=5;
	for(int i=1;i<6;++i)
		for(int j=1;j<6;++j)
			cnt.x[i][j]=(i==j);
	for(;y;y>>=1,dx=dx*dx)
		if(y&1)
			cnt=cnt*dx;
	return cnt;
}

ll n;

int main(){
	scanf("%lld",&n);
	if(n==0){
		printf("%d",1);
		return 0;
	}
	memr ans;
	ans.a=1,ans.b=5;
	memset(ans.x,0,sizeof(ans.x));
	ans.x[1][1]=3;
	ans.x[1][2]=2,ans.x[1][3]=ans.x[1][5]=1;
	ans.x[1][4]=2;
	ans=ans*ksm(n-1);
	printf("%lld",ans.x[1][1]);
	return 0;
}

B.P6239 [JXOI2012]奇怪的道路

  • 打表大法好啊,白嫖 30pts

Solution

  • 看数据范围,很明显是状压 DP

  • 设计状态 fi,j,p,q 表示考虑前 i 个点,j 条边,后 k 个点压成二进制为 p,前 i1 个点向前的边都连完了,i 只与在它之前长度为 k1 的区间中的点连了边的方案数。如果节点 x 的度数为奇数,则表现在 p 中的那一位就为 1

  • 状态转移如下:

    • fi,j+1,p1(1<<t1),q+=fi,j,p,q,表示由 iit1 连一条边;
    • fi,j,p,q1+=fi,j,p,q,表示从下一条边开始考虑连向 it
    • fi+1,j,p<<1,min(i,q+=fi,j,p,0,表示如果 ik 节点度数为偶数,则考虑 i+1 点的连边情况;
AC code
#include<bits/stdc++.h>
using namespace std;

const int mod=1e9+7; 

int n,m,k;
int f[35][35][(1<<10)+10][35];

int main(){
	scanf("%d%d%d",&n,&m,&k);
	f[1][0][0][0]=1;
	for(int i=1;i<=n;++i){
		for(int j=0;j<=m;++j){
			for(int p=0;p<1<<(k+1);++p){
				for(int q=min(i-1,k);q;--q){
					(f[i][j][p][q-1]+=f[i][j][p][q])%=mod;
					if(i>q)
						(f[i][j+1][p^(1<<q)^1][q]+=f[i][j][p][q])%=mod;
				}
				if(!(p&(1<<k)))
					(f[i+1][j][p<<1][min(i,k)]+=f[i][j][p][0])%=mod;
			}
		}
	}
	printf("%d",f[n][m][0][0]);
	return 0;
}

本文作者:Star_LIcsAy

本文链接:https://www.cnblogs.com/Star-LIcsAy/p/16625561.html

版权声明:本作品采用Star_LIcsAy许可协议进行许可。

posted @   Star_LIcsAy  阅读(36)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 Paradise Lost 不安定/言和
  2. 2 我从人间走过 瞳莹/言和
  3. 3 被神明所抛弃 瞳莹/乐正绫
  4. 4 JUSF周存/洛天依
  5. 5 梦之森 JUSF周存/洛天依/言和
  6. 6 四重罪孽 DELA/雨狸/洛天依/言和
  7. 7 五重空洞 DELA/雨狸/洛天依/乐正绫
  8. 8 神っぽいな 初音未来
  9. 9 微观戏剧 言和
  10. 10 Reincarnate 寺岛拓笃
  11. 11 DELA/雨狸/洛天依
  12. 12 多情岸 AtonyP/乐正绫
  13. 13 我对孤独一无所知 洛天依
  14. 14 【洛天依V5】世界沉睡童话 洛天依
  15. 15 人是_ 周深
  16. 16 双向倾诉 洛天依/言和
  17. 17 三重爱恋 洛天依/言和
  18. 18 山河令 洛天依
  19. 19 夜航星 洛天依
  20. 20 此处通往天空 星尘
  21. 21 雪夜千阳 洛天依
  22. 22 单行恶魔 乐正绫
  23. 23 创作者之死 洛天依/狐狸座vul
  24. 24 日心陨落 乐正绫
  25. 25 八分之一 镜音铃/镜音连
  26. 26 多重妄想 洛天依
  27. 27 アブノーマリティ・ダンシンガール ぐちり/v flower
Reincarnate - 寺岛拓笃
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 寺島拓篤

作曲 : R・O・N

编曲 : R・O・N

傷つけた数だけ その両手で撒いた

希望の種はいつか 芽を出すのだろう

永遠だってなんだって 関係ないんだって

あぁ 君が笑うなら

パッと散っていった 瞬間の意味を

見つける旅路へと

ともに行こう

今は涙拭い去って

群青の空 振り仰げば

embraces あたたかな虹が

千載に一遇の"当たり前"を

気づけずに見落とした日常のカケラは

果てない道でいつか また会えるだろう

金輪際と誓って結んだ絆が

綻びそうでも

何十回だって何百回だって

もう諦めたくないんだ

だから行こう

君をとりまくすべてが

一斉に祝福を歌うよ

tenderness 生まれくる未来の

一片も取りこぼさぬように

After the rain

雨は上がり

Sun is shining

光射し

Future is calling

さあ行こう

君との夢の先

未来よ輝けと願う

繋いでいたい 悟られぬように

精一杯の祈りを抱いて

ともに行こう

君が残した影の上

一瞬のつむじ風に乗って

reincarnate 咲き誇る花が

殺風景な世界を彩るよ

If you were reincarnated,

I'd be with you wherever you go.

Our souls are connected,

I'll always by your side.