【简•解】花园

【题目描述】#

传送门

L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2N1015)。他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2M5,MN)个花圃中有不超过K(1K<M)C形的花圃,其余花圃均为P形的花圃。

求合法方案数,对模烂的数1e9+7取模。

【分析】#

看到M这么小,考虑到状压。

但看到N这么大,那就快速幂吧,此题完。

【Code】#

Copy
#include<cstdio> #include<cstdlib> #include<cstring> #define ll long long #define debug() puts("FBI WARNING!") using namespace std; const int P = 19260817; const int MOD = 1000000007; const int MAX = 300000 + 5; const int M = 5; inline ll read(){ ll f = 1, x = 0; char ch; do { ch = getchar(); if (ch == '-') f = -1; } while (ch < '0' || ch > '9'); do {x = (x << 3) + (x << 1) + ch - '0'; ch = getchar(); } while (ch >= '0' && ch <= '9'); return f * x; } struct TOOL { #define Hanabi ll inline Hanabi max(Hanabi a, Hanabi b) { return a < b ? b : a; } inline Hanabi min(Hanabi a, Hanabi b) { return a < b ? a : b; } inline Hanabi abs(Hanabi a) { return a < 0 ? a : a; } }t; int m, K, jd[1 << M], limit, cover; ll n, f[1 << M], vis[1 << M][1 << M], ans; inline void mul() { ll c[1 << M]; memset(c, 0, sizeof c); for (int j = 0;j < limit; ++j) { for (int k = 0;k < limit; ++k) { c[j] = (c[j] + f[k] * vis[k][j]) % MOD; } } memmove(f, c, sizeof c); } inline void mulself() { ll c[1 << M][1 << M]; memset(c, 0, sizeof c); for (int i = 0;i < limit; ++i) { for (int j = 0;j < limit; ++j) { for (int k = 0;k < limit; ++k) { c[i][j] = (c[i][j] + vis[i][k] * vis[k][j]) % MOD; } } } memmove(vis, c, sizeof c); } int main(){ n = read(), m = read(), K = read(); limit = 1 << m; cover = (1 << (m - 1)) - 1; for (int i = 0;i < limit; ++i) { int cnt = 0; for (int j = 0;j < m; ++j) { if (i & (1 << j)) ++cnt; } if (cnt <= K) jd[i] = 1; } for (int i = 0;i < limit; ++i) { if (jd[i] == 0) continue; memset(f, 0, sizeof f); f[i] = 1; memset(vis, 0, sizeof vis); for (int j = 0;j < limit; ++j) { if (jd[j] && jd[(j & cover) << 1]) vis[j][(j & cover) << 1] = 1; if (jd[j] && jd[((j & cover) << 1) | 1]) vis[j][((j & cover) << 1) | 1] = 1; } ll x = n; while (x) { if (x & 1) mul(); mulself(); x >>= 1; } ans = (ans + f[i]) % MOD; } printf("%lld", ans); return 0; }
posted @   SilentEAG  阅读(229)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
CONTENTS