這個題就是對於每個數算貢獻,如果有相同的數,只計算先出現的數的貢獻
對於數x,若它在前i行的數目分別為a1,a2......ai。則這個數的貢獻應為:ai*x*(n-a1)*(n-a2)*.....*(n-a(i-1))*n^(m-i)次方。這樣想,如果不要求不重複算,那大小就直接是ai*n^(m-1)了
(n-a1)*(n-a2)*.....*(n-a(i-1))保證了前面不會出現相同的,n^(m-i)後面則不需要顧忌,因為就算選到了相同的,也只會把前面的數算進去
這個題非常玄學,不用快讀時而過,時而不過,用了快讀就穩過,以後能用快讀就還是盡量用吧。
**實現:首先將所有數字從小到大排序,第二關鍵字為所在的行,這樣一來,相同的數字排到了一起,並且相同數字且在同一行的數也排在了一起,這樣就能很方便地統計每種數字,在每一行出現的次數
用前後是否相同來判斷是否到了分界點,具體實現見**
#includeusingnamespace
std;
typedef
long
long
ll;const
int inf=1
<<30
;const
int maxn=2001
;const
double pi=acos(-1
);const
int mod=1000000007
;struct
node
}p[maxn*maxn];
ll q[maxn];
inline
void read(int &x)
intmain();
}sort(p+1,p+cnt+1);int first=1
;
for(int i=1;i<=cnt;i++)
}ans=(ans+(ll)p[i].a*t%mod*s%mod*q[m-k-1])%mod;//
這個加和迴圈裡的加其實沒區別,因為少了k++這一步q陣列多減乙個1
first=i+1
; }
}cout
return0;
}
牛客練習賽42 出題的訣竅(數學 hash)
出題的訣竅 題解 由於他是在每一行選取乙個元素,然後縱向來比較,這裡行的順序是不會影響的,所以我們將每乙個數存入雜湊表中,然後對每乙個數來進行考慮。第一行的數,對答案的貢獻為mn 1,而第二行對答案的貢獻為mn 2 m 1 以此類推。這裡注意對同一行有多個相同元素的情況考慮一下。如下 include...
牛客練習賽42題解
寫題寫的感覺自己彷彿是個傻子 給定兩個等長的由小寫字母構成的串 a,b,其中 a b n 現在你需要求出乙個子區間 l,r 使得 lcp a l,r b l,r lcs a l,r b l,r lcp a l,r b l,r lcs a l,r b l,r 最大,並輸出這個值。lcp s,t 表示s...
牛客練習賽42(A,B)
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 給定兩個等長的由小寫字母構成的串 a,ba,b,其中 a b n 現在你需要求出乙個子區間 l,r 使得 lcp a l,r b l,r lcs a l,r b l...