將乙個長度為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 ...