[JZOJ5836] Sequence

Problem

題目鏈接

Solution

吼題啊吼題!

首先如何求本質不同的子序列個數就是 \(f[val[i]]=1+\sum\limits_{j=1}^k f[j]\)

其中 \(f[i]\) 表示的是以 \(i\) 結尾的子序列個數

先把原數列的不同子序列個數求出來,然后觀察一下這個轉移,貪心的發現每次都是選一個最早出現的 \(i\) 填到序列末尾,然后更新這個值。

所以填的部分一定是 \(\frac mk\)\(K\) 的排列,還有多出來了 \(m\%k\) 個元素暴力填進去。

\(K\) 個元素的轉移是一樣的,可以拿矩乘做。然后多余的部分求前綴積暴力求就行了。

Code

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cctype>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using std::min;
using std::max;
using std::swap;
using std::vector;
const int N=105;
const int M=1e6+5;
typedef double db;
typedef long long ll;
#define int long long
const int mod=1e9+7;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define mp(A,B) std::make_pair(A,B)int n,m,k,per[M];
int val[M];pii las[M];struct Mat{int a[N][N];void clear(){memset(a,0,sizeof a);}void init(){clear();for(int i=1;i<=k+1;i++)a[i][i]=1;}void print(){for(int i=1;i<=k+1;i++,puts(""))for(int j=1;j<=k+1;j++)printf("%lld ",a[i][j]);}friend Mat operator*(Mat x,Mat y){Mat z;z.clear();for(int i=1;i<=k+1;i++){for(int p=1;p<=k+1;p++){for(int j=1;j<=k+1;j++)z.a[i][j]=(z.a[i][j]+x.a[i][p]*y.a[p][j]%mod)%mod;}} return z;}
}cs,f,qzh[N];int getint(){int X=0,w=0;char ch=0;while(!isdigit(ch))w|=ch=='-',ch=getchar();while( isdigit(ch))X=X*10+ch-48,ch=getchar();if(w) return -X;return X;
}Mat ksm(Mat x,int y){Mat ans;ans.init();while(y){if(y&1) ans=ans*x;x=x*x;y>>=1;} return ans;
}signed main(){freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);n=getint(),m=getint(),k=getint();int sum=0;f.clear();f.a[1][k+1]=1;for(int i=1;i<=k;i++) las[i]=mp(0,i);for(int i=1;i<=n;i++){val[i]=getint();int p=f.a[1][val[i]];f.a[1][val[i]]=(sum+1)%mod;sum-=p;sum+=f.a[1][val[i]];sum%=mod;las[val[i]]=mp(i,val[i]);} std::sort(las+1,las+1+k);qzh[0].init();for(int i=1;i<=k;i++){per[i]=las[i].second;qzh[i].clear();for(int j=1;j<=k+1;j++) qzh[i].a[j][j]=1;for(int j=1;j<=k+1;j++) qzh[i].a[j][per[i]]=1;qzh[i]=qzh[i-1]*qzh[i];} cs=ksm(qzh[k],m/k);cs=cs*qzh[m%k];f=f*cs;int ans=0;for(int i=1;i<=k;i++) (ans+=f.a[1][i])%=mod;printf("%lld\n",ans);return 0;
}

轉載于:https://www.cnblogs.com/YoungNeal/p/9780949.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249298.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249298.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249298.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

numpy和pandas的基礎索引切片

Numpy的索引切片 索引 In [72]: arr np.array([[[1,1,1],[2,2,2]],[[3,3,3],[4,4,4]]]) In [73]: arr Out[73]: array([[[1, 1, 1],[2, 2, 2]],[[3, 3, 3],[4, 4, 4]]])In [74]: arr.nd…

mybatis的Example[Criteria]的使用

https://blog.csdn.net/u014756578/article/details/86490052

Thunar 右鍵菜單等自定義

Thunar 右鍵菜單等自定義 可以使用圖形界面或者直接編輯配置文件&#xff0c;二者是等價的。 圖形界面&#xff1a; 以給“zip&#xff0c;rar&#xff0c;7z”等文件添加“在此位置使用unar解壓縮”的右鍵菜單為例&#xff1a;&#xff08;unar可以很好地處理編碼問題&#xf…

JavaScript設計模式(二)之單例模式

一、單例模式的定義 單例就是保證一個類只有一個實例&#xff0c;實現的方法一般是先判斷實例存在與否&#xff0c;如果存在直接返回&#xff0c;如果不存在就創建后再返回&#xff0c;這就確保了一個類只有一個實例對象。在JavaScript里&#xff0c;單例作為一個命名空間的提…

python全棧開發_day10_函數的實參和形參

一&#xff1a;函數的實參和形參 實參是在調用函數時()出現的外界的實際的值 形參不能再函數外部直接使用 1&#xff09;實參的兩種形式 實參是調用函數時()中傳入的參數 1.位置實參 def a(a):print(a)a(1)#得到返回值:1 2.關鍵字實參 def a(a,b):print(a,b)a(b3,a5)#得到返回值…

JAVA的(PO,VO,TO,BO,DAO,POJO)解釋

JAVA的(PO,VO,TO,BO,DAO,POJO)解釋 O/R Mapping 是 Object Relational Mapping&#xff08;對象關系映射&#xff09;的縮寫。通俗點講&#xff0c;就是將對象與關系數據庫綁定&#xff0c;用對象來表示關系數據。在O/R Mapping的世界里&#xff0c;有兩個基本的也是重要的東東…

使用wsimport命令生成webService客戶端代碼實例

https://blog.csdn.net/qq_39459412/article/details/79079865

學習網站大匯集

一.綜合類學習網站&#xff08;中文&#xff09; 1.網易公開課&#xff1a;https://open.163.com/。上面有TED、可汗學院、國內外高校公開課的免費資源。站內內容完全免費&#xff0c;良心推薦。 2.網易云課堂&#xff1a;http://study.163.com/。網易旗下付費學習平臺&#…

ios怎樣在一個UIImageButton的里面加一些自己定義的箭頭

能夠採用例如以下方法&#xff0c;寫一個函數&#xff1a; -(UIImage*) getOneImageButtonWithArrow{//tmpView做附控件UIView *tmpView [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 38.0f, 32.0f)];tmpView.backgroundColor [UIColor clearColor];//bgImg作為背景…

vue從入門到精通之基礎篇(一)語法概要

(1).vue起步 1:引包2:啟動 new Vue({el:目的地,template:模板內容});options 目的地 el內容 template數據 data 保存數據屬性 數據驅動視圖 (2).插值表達式 {{ 表達式 }} 對象 (不要連續3個{{ {name:‘jack’} }})字符串 {{ ‘xxx’ }}判斷后的布爾值 {{ true }}三元表達式…

dede 文章列表頁如何倒序排列

{dede:arclist row6 typeid18 orderwayasc} <li>;<a href"[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} 正常排列&#xff1a;orderwayasc倒序排列&#xff1a;orderwaydesc轉載于:https://www.cnblogs.com/php-qiuwei/p/1062…

Chapter 5 Blood Type——24

"Shes just a little faint," he reassured the startled nurse. "Theyre blood typing in Biology." "她只是有點頭暈&#xff0c;" 他讓護士放心的說道。“他們再生物課上測血型。” The nurse nodded sagely. "Theres always one."…

vue從入門到精通之基礎篇(二)組件

(1).局部組件的使用 ? 渲染組件-父使用子組件 1: 創建子組件(對象) var Header { template:模板 , data是一個函數,methods:功能,components:子組件們 } 2: 在父組件中聲明,根屬性components:{ 組件名:組件對象 }3: 在父組件要用的地方使用 <組件名></組件名> …

@Scheduled

Scheduled注解的使用這里不詳細說明&#xff0c;直接對8個參數進行講解。 參數詳解 cron 該參數接收一個cron表達式&#xff0c;cron表達式是一個字符串&#xff0c;字符串以5或6個空格隔開&#xff0c;分開共6或7個域&#xff0c;每一個域代表一個含義。 cron表達式語法 […

eclipse2019-03設置代碼編輯區背景為圖片

一、我的主題設置如下所示 二、找到如下所示或類似的文件夾 三、在該文件夾里的images文件夾里添加圖片 四、在CSS目錄下的e4-dark_win.css文件中添加如下代碼   .MPart StyledText {     background-image: url(./bg.jpg);     background-repeat: no-repeat;  …

idea集成gitlab使用ssh免密登錄

網上有很多介紹ssh免密登錄的文章&#xff0c;具體步驟如下&#xff1a; 1. 生成SSH Key ssh-keygen -t rsa -C "your_emailexample.com" 默認會在相應路徑下&#xff08;/your_home_path&#xff09;生成id_rsa和id_rsa.pub兩個文件&#xff0c;此時終端會顯示&…

vue從入門到精通之基礎篇(三)生命周期

生命周期 定義&#xff1a; 每個 Vue 實例在被創建時都要經過從創建倒掛載再到更新、卸載的一系列過程&#xff0c;同時在這個過程中也會運行一些叫做生命周期鉤子的函數&#xff0c;可以讓我們用自己注冊的js方法控制整個大局&#xff0c;在這些事件響應方法中的this直接指向…

libcurl庫進行http通訊網絡編程

https://www.cnblogs.com/lifan3a/articles/7479256.html

Java 開始

&#xff08;事先聲明&#xff1a;該文章并非完全是我自己的產出&#xff0c;更多的是我個人在看到資料后通過理解并記錄下來&#xff0c;作為自己閱讀后的一個筆記&#xff1b;我現在試圖對自己多年工作中的知識點做一個回顧&#xff0c;希望能融會貫通&#xff09; &#xff…

Java核心技術筆記——第 12 章 反射

轉載自&#xff1a;[https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html] 12 反射 1. 引入反射 通常情況下&#xff0c;調用一個類的方法的步驟如下&#xff1a; 創建該類的對象。調用該對象的方法。通過這種方式調用方法時&#xff0c;必須要知道類的定義以及…