标签:整理 ret 假设 思考 ace mod bsp 简单 pac
题目连接:https://www.luogu.com.cn/problem/P2220
——————————————————————————————————————————————————
题解:
从简单到困难的一步一步去思考:
我们先假设k=0;
ai为a位的可能;bi为b位的可能;ci为c位的可能...
则: a1*b1*c1+a1*b1*c2+a1*b2*c1+a1*b2*c2+a2*b1*c1+a2*b1*c2+a2*b2*c1+a2*b2*c2;
整理:(a1+a2)*(b1+b2)*(c1+c2);
然后考虑k;
即(a1+a2-z1)*(b1+b2-z2)*(c1+c2-z3);
这样你就有个O(n)了
但还不够;
再考虑K的大小;
于是把被k影响的先算了,再快速幂
O(k)的算法;
代码:
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <map> 5 #define ll long long 6 using namespace std; 7 const int maxn=100005; 8 const long long mod=1e9+7; 9 map<pair<ll,ll>,ll> pe1; 10 map<ll,ll> pe2; 11 ll e[maxn]; 12 ll kuai(ll now,ll mi){ 13 ll e=now%mod,ans=1; 14 while(mi){ 15 if(mi&1) ans*=(e%mod),ans%=mod; 16 e*=(e%mod),e%=mod; 17 mi>>=1; 18 } 19 return ans; 20 } 21 int main(){ 22 //freopen("a.in","r",stdin); 23 ll n,m,k,luo=0; 24 scanf("%lld%lld%lld",&n,&m,&k); 25 for(ll i=1;i<=k;i++){ 26 ll x,y; 27 scanf("%lld%lld",&x,&y); 28 if(!pe2[x]) e[++luo]=x; 29 if(pe1[make_pair(x,y)]) continue; 30 pe1[make_pair(x,y)]=1; 31 pe2[x]+=y; 32 } 33 ll ans=1,cluo=(n+1)*n/2; 34 for(ll i=1;i<=luo;i++){ 35 ans*=(cluo-pe2[e[i]])%mod; 36 ans%=mod; 37 } 38 printf("%lld\n",ans%mod*kuai(cluo,m-luo)%mod%mod); 39 return 0; 40 }
标签:整理 ret 假设 思考 ace mod bsp 简单 pac
原文地址:https://www.cnblogs.com/DZN2004/p/12887849.html