码迷,mamicode.com
首页 > 其他好文 > 详细

easy题——difficult数学

时间:2020-05-14 12:51:39      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:整理   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 }

 

easy题——difficult数学

标签:整理   ret   假设   思考   ace   mod   bsp   简单   pac   

原文地址:https://www.cnblogs.com/DZN2004/p/12887849.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!