又考挂了QAQ 总rank直接滑出前20
晚上考试脑子还算比较清醒,可惜都用来xjb乱想错误思路了。
T1一眼推柿子,然而并没有头绪所以先码了个暴力。然后……
一个垃圾暴力我调了1h,大概解决了两位数个sb错误之后终于调出来了。本来觉得考了这么多场代码能力长了不少,暴搜什么的一边过样例应该没问题的。可能这次写的时候比较急躁?抑或是学了几天文化课码力大减?反正浪费这么多时间是很不应该的。
暴力尽量一遍打对,它不配你在调试上花时间。
然后写了个打表程序去看T2。因为T1只打了个暴力所以A掉T2的想法十分强烈,想了各种奇奇怪怪的方法(甚至想到了正解的时光倒流),但要么是复杂度不优,要么打到一半把自己否了,又不得不删了重想。就这么删了码码了删浪费了很多时间,感觉像是回到了一开始没怎么考过试的时候。
码之前一定要保证思路基本是正确的,条件允许的话应该先手玩几组样例。
这样大概过了一个半小时,忽然发现自己连最sb的暴力都没打,慌忙码了一个二维前缀和结果死也调不出来,后来发现是自己二维前缀和查询的柿子打错了,赶紧手推了一下过了样例。
二维前缀和查询$(i,j)$到$(x,y)$的权值和:$ans=sum(x,y)-sum(i-1,y)-sum(x,j-1)-sum(i-1,j-1)$。简单的东西一定要记清楚,确保自己考场能不浪费一秒钟。
最后不剩多少时间了,T1交了个表,T2感觉q=1的点不一定能跑过去于是卡了卡常,看了一会T3发现期望题好像不能骗分就弃掉了。然后大概检查了一下好像没有问题,于是就无奈地闲坐着心里mmp。
结束之后发现T1看错数据范围打表打少了扔掉20,T3有20分是白痴暴搜没打。
最后一定要再看一眼题啊QAQ
发现T1的柿子好像挺简单的,要是一开始打完T2的暴力就回来想正解的话应该能推出来。T2没有我想的那么水,感觉自己分析难度能力基本没有啊ccc。
$Solution:$
解题关键在于理解$\sum i\times f[i]$的含义,所有方案中炼字个数之和。
考虑$[1,k]$每个数对答案的贡献,当方格$(x,y)$填$i (i \in [1,k])$且$i$是炼字时,它对答案的贡献(产生的方案数)是$(i-1)^{n-1}(i-1)^{m-1}k^{nm-n-m+1}$。
那么最后的答案就是$nm \times \sum \limits _{i=1}^{k} (i-1)^{n-1} (i-1)^{m-1} k^{nm-n-m+1}$
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n,m,k,ans;
ll qpow(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(ll i=1;i<=k;i++)
ans+=(qpow(i-1,n-1)*qpow(i-1,m-1)%mod*qpow(k,n*m-n-m+1)%mod),ans%=mod;
ans=ans*n%mod*m%mod;
cout<<ans<<endl;
return 0;
}
原文:https://www.cnblogs.com/Rorschach-XR/p/11428977.html