牛客 復讀陣列

2021-09-29 09:27:05 字數 1402 閱讀 2189

將乙個長度為n

nn的陣列複製成k

kk份,然後每個區間的值是乙個區間中不同的數的數量,求每個非空區間的值和。

若乙個區間長度》

n>n

>

n那麼他們的值是固定的,所以我們可以先計算出這些區間的答案。

現在只需要考慮長度<

n<

n的區間,我們講原陣列複製乙份放到後面後,我們用f

if_i

fi​表示第i

ii個結尾的區間權值和。若不考慮i

ii這個位置的貢獻那麼fi=

fi−1

f_i=f_

fi​=fi

−1​,i

ii這個位置影響的區間是到上乙個和它相同的位置las

tlast

last

。也就是fi=

fi−1

+i−l

as

tf_i=f_+i-last

fi​=fi

−1​+

i−la

st。當i

>

ni>n

i>

n時我們不能計算左端點》

n>n

>

n的區間,所以我們就改為fi=

fi−1

+max

f_i=f_+max\

fi​=fi

−1​+

max即可。

#include

#include

#include

#define ll long long

using

namespace std;

const ll n=

2e5+

10,xjq=

1e9+7;

ll n,k,a[n]

,ans,num,b[n]

,v[n]

;ll power

(ll x,ll b)

return ans;

}int

main()

ans=num*n%xjq*n%xjq;

ans=ans*

max(

(k-2)*

(k-1

)%xjq,

0ll)

%xjq*

power(2

,xjq-2)

%xjq;

memset

(v,0

,sizeof

(v))

;num=0;

ll sum=

0,z=0;

for(ll i=

1;i<=

2*n;i++

)printf

("%lld"

,(ans+sum)

%xjq)

;}

牛客 復讀陣列(矩陣加速 數學)

有乙個長為n k的陣列,它是由長為n的陣列a1,a2,an重複k次得到的。定義這個陣列的乙個區間的權值為它裡面不同的數的個數,現在,你需要求出對於這個陣列的每個非空區間的權值之和。答案對109 7取模。第一行兩個整數n和k。接下來一行n個整數,第i個整數為ai。輸出乙個整數,表示答案。示例1輸入 2...

尋找復讀機(牛客網)

某個 qq 群裡一共有 n 個人,他們的編號是 1 n,其中有一些人本質上是復讀機。小 a 發現,如果乙個人的本質是復讀機,那麼他每次發的訊息一定跟群裡的上一條訊息一樣,特別地第乙個發訊息的人一定不是復讀機。現在小 a 搞到了乙份聊天記錄,他想請你找出所有可能是復讀機的群友 第一行兩個正整數 n,m...

牛客 牛牛與陣列

牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 輸入兩個整數n,k 1 n 10 1 k 100000輸出乙個整數示例1 複製2 2 複製3 示例2複製9 1 ...