【2018.4.14】模拟赛之三-ssl2393 单元格
生活随笔
收集整理的這篇文章主要介紹了
【2018.4.14】模拟赛之三-ssl2393 单元格
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
大意
在一個n*m的矩陣里找三個矩陣,要求他們三都不在同一行和同一列。然后要求價值不在minT和maxT之間,他們的價值就等于dis[A,B]+dis[B,C]+dis[A,C]dis[A,B]+dis[B,C]+dis[A,C]。求方案數。
解題思路
首先如果需要去掉重復的所以我們可以把A鎖定在B和C上面
,而C鎖定在A和B下面,然后有6種情況。
| A | N | N | |
| N | B | N | |
| N | N | C |
| N | A | N | |
| B | N | N | |
| N | N | C |
| N | N | A | |
| B | N | N | |
| N | C | N |
| A | N | N | |
| N | N | B | |
| N | C | N |
| N | A | N | |
| N | N | B | |
| C | N | N |
| N | N | A | |
| N | B | N | |
| C | N | N |
然后求出一種之后要乘上6。
求出在maxT之間的值減去minT的值就好了
我們枚舉寬度差,之后求出滿足價值的最大高度差,然后分為:
1. 寬度差過了邊界
2. 寬度差沒過邊界
然后推公式
代碼
#include<cstdio> #define mods 1000000007 using namespace std; int n,m; long long sum1[4002],sum2[4002],mint,maxt; long long work(long long x)//求值{if (x<8) return 0;long long ans,tmp;ans=0;for (int i=2;i<n;i++){int j=(x-2*i)/2;if (j<=1) break;if (j+1>=m) tmp=6*(n-i)*(i-1)*sum2[m-2]%mods;else tmp=6*(n-i)*(i-1)*(sum1[j-1]*(m-j)+sum2[j-2])%mods;ans=(ans+tmp)%mods;}return ans; } int main() {scanf("%d%d%d%d",&n,&m,&mint,&maxt);for (int i=1;i<=4001;i++){sum1[i]=sum1[i-1]+i;sum2[i]=sum2[i-1]+sum1[i];//預處理}printf("%lld",(work(maxt)+mods-work(mint-1))%mods); }總結
以上是生活随笔為你收集整理的【2018.4.14】模拟赛之三-ssl2393 单元格的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星S24 Ultra或采用钛金属外壳!
- 下一篇: 小米 14 Pro 钛金属特别版手机非限