日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

微信步数C++

發布時間:2023/12/14 c/c++ 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信步数C++ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

小 C 喜歡跑步,并且非常喜歡在微信步數排行榜上刷榜,為此他制定了一個刷微信步數的計劃。

他來到了一處空曠的場地,處于該場地中的人可以用?kk?維整數坐標?(a1,a2,…,ak)(a1,a2,…,ak)?來表示其位置。場地有大小限制,第?ii?維的大小為?wiwi,因此處于場地中的人其坐標應滿足?1≤ai≤wi1≤ai≤wi(1≤i≤k1≤i≤k)。

小 C 打算在接下來的?P=w1×w2×?×wkP=w1×w2×?×wk?天中,每天從場地中一個新的位置出發,開始他的刷步數計劃(換句話說,他將會從場地中每個位置都出發一次進行計劃)。

他的計劃非常簡單,每天按照事先規定好的路線行進,每天的路線由?nn?步移動構成,每一步可以用?cici?與?didi?表示:若他當前位于?(a1,a2,…,aci,…,ak)(a1,a2,…,aci,…,ak),則這一步他將會走到?(a1,a2,…,aci+di,…,ak)(a1,a2,…,aci+di,…,ak),其中?1≤ci≤k1≤ci≤k,di∈{?1,1}di∈{?1,1}。小 C 將會不斷重復這個路線,直到他走出了場地的范圍才結束一天的計劃。(即走完第?nn?步后,若小 C 還在場內,他將回到第?11?步從頭再走一遍)。

小 C 對自己的速度非常有自信,所以他并不在意具體耗費的時間,他只想知道?PP?天之后,他一共刷出了多少步微信步數。請你幫他算一算。

輸入格式

第一行兩個用單個空格分隔的整數?n,kn,k。分別表示路線步數與場地維數。

接下來一行?kk?個用單個空格分隔的整數?wiwi,表示場地大小。

接下來?nn?行每行兩個用單個空格分隔的整數?ci,dici,di,依次表示每一步的方向,具體意義見題目描述。

輸出格式

僅一行一個整數表示答案。答案可能很大,你只需要輸出其對?109+7109+7?取模后的值。

若小 C 的計劃會使得他在某一天在場地中永遠走不出來,則輸出一行一個整數??1?1。

樣例數據

3 2 3 3 1 1 2 -1 1 1 21 5 4 6 8 6 5 3 1 2 1 1 1 2 1 2 -1 10265 5 5 3 3 1 3 2 4 1 4 -1 1 -1 3 -1 2 1 150 100 3 8 7 6 1 1 1 -1 3 1 3 -1 3 1 3 -1 3 1 3 -1 1 1 1 -1 1 1 1 -1 2 1 2 -1 1 1 1 -1 2 1 2 -1 3 1 3 -1 3 1 3 -1 3 1 3 -1 2 1 2 -1 3 1 3 -1 3 1 3 -1 1 1 1 -1 1 1 1 -1 3 1 3 -1 3 1 3 -1 1 1 1 -1 1 1 1 -1 2 1 2 -1 1 1 1 -1 2 1 2 -1 2 1 2 -1 2 1 2 -1 3 1 3 -1 1 1 1 -1 3 1 3 -1 3 1 3 -1 3 1 3 -1 3 1 3 -1 1 1 1 -1 3 1 3 -1 1 1 1 -1 2 1 2 -1 1 1 1 -1 1 1 1 -1 2 1 2 -1 2 1 2 -1 1 1 1 -1 3 1 3 -1 1 1 1 -1 2 1 2 -1 1 1 1 -1 3 1 3 -1 3 1 3 -1 3 1 3 -1 2 1 2 -1 3 1 3 -1 -1

數據范圍

【樣例 #1 解釋】

從?(1,1)(1,1)?出發將走?22?步,從?(1,2)(1,2)?出發將走?44?步,從?(1,3)(1,3)?出發將走?44?步。

從?(2,1)(2,1)?出發將走?22?步,從?(2,2)(2,2)?出發將走?33?步,從?(2,3)(2,3)?出發將走?33?步。

從?(3,1)(3,1)?出發將走?11?步,從?(3,2)(3,2)?出發將走?11?步,從?(3,3)(3,3)?出發將走?11?步。

共計?2121?步。

【數據范圍】

測試點編號n≤n≤k≤k≤wi≤wi≤
1~31~3555533
4~64~6100100331010
7~87~810510511105105
9~129~1210510522106106
13~1613~165×1055×1051010106106
17~2017~205×1055×10533109109

對于所有測試點,保證?1≤n≤5×1051≤n≤5×105,1≤k≤101≤k≤10,1≤wi≤1091≤wi≤109,di∈{?1,1}di∈{?1,1}。

#include <bits/stdc++.h> #define rep(i, a, b) for (int i = (a); i <= int(b); i++) #define per(i, a, b) for (int i = (a); i >= int(b); i--) using namespace std;typedef long long ll; const int maxn = 5e5, mod = 1e9 + 7;int n, k, w[10], c[maxn + 5], d[maxn + 5], dt[10], res, S[11][11], inv[12];struct foo {int z[10], l[10], r[10];void reset() {memset(z, 0, k << 2);memset(l, 0, k << 2);memset(r, 0, k << 2);}foo() {reset();}int walk(int c, int d) {z[c] += d;if (z[c] < l[c] || z[c] > r[c]) {l[c] = min(l[c], z[c]);r[c] = max(r[c], z[c]);return d;}return 0;} } F, B;inline void red(int &x) {x += x >> 31 & mod; }void prework(int n) {S[0][0] = 1;rep(i, 1, n) rep(j, 1, i) {S[i][j] = (S[i - 1][j - 1] + ll(S[i - 1][j]) * j) % mod;}inv[1] = 1;rep(i, 2, n + 1) {inv[i] = ll(mod - mod / i) * inv[mod % i] % mod;} }int calc(int k, int n) {int s = 0, c = 1;rep(i, 0, k) {c = ll(c) * max(0, n - i) % mod;s = (s + ll(c) * inv[i + 1] % mod * S[k][i]) % mod;}return s; }int work(int a[]) {int lim = mod;rep(i, 0, k - 1) if (dt[i]) {lim = min(lim, (a[i] + dt[i] - 1) / dt[i]);}int dp[11] = { 1 };rep(i, 0, k - 1) {per(j, i, 0) {dp[j + 1] = (dp[j + 1] + ll(mod - dt[i]) * dp[j]) % mod;dp[j] = ll(a[i]) * dp[j] % mod;}}int res = 0;rep(i, 0, k) {res = (res + ll(dp[i]) * calc(i, lim)) % mod;}return res; }int main() {scanf("%d %d", &n, &k);prework(k);rep(i, 0, k - 1) {scanf("%d", &w[i]);}rep(i, 1, n) {scanf("%d %d", &c[i], &d[i]), c[i]--;if (F.walk(c[i], d[i]) && F.r[c[i]] - F.l[c[i]] <= w[c[i]]) {int x = 1;rep(j, 0, k - 1) if (j != c[i]) {x = ll(x) * max(0, w[j] - F.r[j] + F.l[j]) % mod;}res = (res + ll(i) * x) % mod;}}rep(i, 1, n) if (F.z[c[i]] < 0) {d[i] = -d[i];}rep(i, 0, k - 1) if (F.z[i] < 0) {F.z[i] = -F.z[i];swap(F.l[i], F.r[i]);F.l[i] = -F.l[i];F.r[i] = -F.r[i];}B = F;bool chk = true;rep(i, 0, k - 1) {dt[i] = B.z[i];chk &= dt[i] == 0;}if (chk) {bool ok = false;rep(i, 0, k - 1) {ok |= B.r[i] - B.l[i] >= w[i];}printf("%d\n", ok ? res : -1);exit(0);}int a[10] = {};rep(i, 1, n) {if (F.walk(c[i], d[i]) && F.r[c[i]] - F.l[c[i]] <= w[c[i]]) {bool ok = true;rep(j, 0, k - 1) if (j != c[i]) {ok &= w[j] - F.r[j] + F.l[j] > 0;}if (!ok) {continue;}rep(j, 0, k - 1) if (j != c[i]) {a[j] = w[j] - F.r[j] + F.l[j];}a[c[i]] = w[c[i]] - F.r[c[i]] + F.l[c[i]] + 1, res = (res + ll(i) * work(a)) % mod;a[c[i]] = w[c[i]] - F.r[c[i]] + F.l[c[i]], res = (res + ll(mod - i) * work(a)) % mod;}}rep(i, 0, k - 1) {a[i] = max(0, w[i] - B.r[i] + B.l[i]);}res = (res + ll(n) * work(a)) % mod;printf("%d\n", res);return 0; }

總結

以上是生活随笔為你收集整理的微信步数C++的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。