贝壳找房计数比赛&&祭facinv

震惊!阶乘逆元处理背后竟有如此玄机……

题目描述

贝壳找房举办了一场计数比赛,比赛题目如下。

给一个字符串 s 和字符串 t,求出 s 的所有去重全排列中 t 出现的次数。比如aab的去重全排列为aabababaa。注意aaaa算出现两次aaa

你的老大希望你帮他写一个程序作弊。

输入格式

第一行一个整数 TT,表示数据组数。

每组数据中,第一行一个字符串 ss,第二行一个字符串 tt。

数据保证 1≤T≤100, 1≤∣t∣≤∣s∣≤105,t,s 只包含小写字母。

输出格式

输出一共 TT 行,每行一个整数,表示所求答案对 10^9+7取模的结果。

样例输入

2
aab
ab
aabb
ab

样例输出

2
6

题目分析

其实就是一道挺简单的数论基础题……

但是复赛时候我想复杂了很多,一直在考虑将目标串拆成多个原串后如何去重之类的问题。

例如原串=ab,目标串=ababaa。然后设t=ab,目标串就有taaab/ttaa这两种情况,于是陷入去重无法自拔……

呃实际上冷静分析就可以发现,只用考虑拆一次的结果,那么就套上可重全排列的公式就好了。

 1 #include<bits/stdc++.h>
 2 const long long MO = 1e9+7;
 3 const long long maxn = 100035;
 4
 5 long long ans,inv[maxn],mp[maxn];
 6 int n,tt;
 7 char s[maxn],t[maxn];
 8 bool fl;
 9
10 int main()
11 {
12     inv[0] = inv[1] = 1;
13     for (int i=2; i<maxn; i++)
14         inv[i] = (long long)(MO-MO/i)*inv[MO%i]*inv[i-1]%MO;
15     scanf("%d",&tt);
16     while (tt--)
17     {
18         fl = 0;
19         memset(mp, 0, sizeof mp);
20         scanf("%s%s",s,t);
21         for (int i=0; s[i]; i++)
22             mp[s[i]]++;
23         for (int i=0; t[i]; i++)
24             mp[t[i]]--, fl = fl||(mp[t[i]]<0);
25         if (fl){
26             printf("0\n");
27             continue;
28         }
29         n = strlen(s)-strlen(t);
30         ans = n+1;
31         while (n--) ans = ans*(n+1)%MO;
32         for (char i=‘a‘; i<=‘z‘; i++)
33             ans = (long long)ans*inv[mp[i]]%MO;
34         printf("%lld\n",ans);
35     }
36     return 0;
37 }

然而!上面这个程序是会WA的!

在历经好长一段时间的调试之后,终于发现facinv中间溢出了……

那么大不了就改成这样嘛,反正是多一个%MO的事情

1 inv[0] = inv[1] = 1;
2 for (int i=2; i<maxn; i++)
3     inv[i] = (MO-MO/i)%MO*inv[MO%i]%MO*inv[i-1]%MO;

可是依旧WA   :)

1 inv[0] = inv[1] = 1;
2 for (int i=2; i<maxn; i++)
3     inv[i] = (MO-MO/i)%MO*inv[MO%i]%MO;
4 for (int i=2; i<maxn; i++) inv[i] = inv[i-1]*inv[i]%MO;

最后只能改成上面这个样子……

行吧终于过了。

END

原文地址:https://www.cnblogs.com/antiquality/p/9245667.html

时间: 2024-08-29 05:34:23

贝壳找房计数比赛&&祭facinv的相关文章

2018计蒜客复赛 贝壳找房函数最值(贪心+优先队列)

贝壳找房函数最值 35.12% 1000ms 262144K 贝壳找房的攻城狮最近在研究一次函数 f(x) = ax + bf(x)=ax+b. 现在有 nn 个一次函数,f_i(x) = a_ix+b_i,\ i = \{1 \mathellipsis n\}fi?(x)=ai?x+bi?, i={1…n}. 容易发现,一次函数嵌套一次函数,还是一次函数. \displaystyle f_{i}(f_{j}(x)) = a_{i} ( a_{j}x + b_{j}) + b_{i}fi?(fj

2020年房地产市场走势 贝壳找房

2020年房地产市场走势如何?来看看贝壳找房的六个判断https://mp.weixin.qq.com/s?src=11&timestamp=1580552050&ver=2132&signature=sR1k1AFwSFu587Leh336sgpknqBiNlVh*Tjgs7lNyC4Z9vHTeokNcBtTFqNmMcKzXQLq-GJOY8-zT7rcMmHs1HbnEV2uOQLwvv1z-ueP1*vnnzxez*7bM4xvBZeBuRYe&new=1 年度展

计蒜客 贝壳找房函数最值(好题,巧妙排序)

题目链接:https://nanti.jisuanke.com/t/27644 题目大意: 解题思路: 代码: 1 #include<bits/stdc++.h> 2 #define lc(a) (a<<1) 3 #define rc(a) (a<<1|1) 4 #define MID(a,b) ((a+b)>>1) 5 #define fin(name) freopen(name,"r",stdin) 6 #define fout(na

贝壳找房函数最值

题解:考虑两个函数 a * ( c * x + d ) + b = ac * x + ad + b,c * ( a * x + b ) + d = ac * x + cb + d,说明和x的系数没有关系,所以按照 ad + b < cb + d排序求解即可. 哎,第一次爆o,按照提示想了个排序,a小的优先,当a相等时b大的优先,结果一直wa....wa,惨烈的教训告诉我下次排序要仔细推一波. 1 #include<bits/stdc++.h> 2 #define maxn (int)1e

2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)

贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于 10^5105 的字符串.现在魔法师想要通过一系列魔法使得这两个字符串相同.每种魔法形如 (u,\ v),\ u,\ v \le 10^5(u, v), u, v≤105,可以将一个字符 uu改成一个字符 vv,并且可以使用无限次.出于种种原因,魔法师会强行指定这两个串能否进行修改. 若失败输出 -

都市白领租房APP定制解决了哪些找房的痛点

现在的都市白领主要是以租房为主,传统找房子存在很多的痛点,要么是朋友介绍,要么就是自己去找.自己找的话,需要专门空一天时间来找,一般都是很盲目地去找的,在想住的地区看到有挂着房东电话号码以及粗略的住房信息的牌子,然后打电话过去咨询,有合适的再去看房,没合适的就接着打下一个电话,这是找城中村房子的方式.还有一种是找小区房子,一般不会在外贴住房信息的,你需要找到房地产中介,让中介帮你找,找到后要给中介付房租一般的中介费用,想想都肉疼.但是互联网APP出现之后,找房子直接线上找,下载一个租房APP就可

Arcgis4js实现链家找房的效果

概述 买房的各位亲们不知是否留意过链家的"地图找房",这样的功能对于使用者来说,是非常方便的,大家可通过连接(https://bj.lianjia.com/ditu/)查看具体效果.鉴于此,本文结合该效果与功能,介绍在Arcgis4js中如何实现类似的效果. 功能效果 1.数据的聚合展示 2.地图高亮 3.聚合数据的钻取 4.列表展示 编码实现 1.数据的聚合展示 链家的实现是基于距离的一个聚合展示,在本实例中做了简化,聚合是通过后台统计查询实现的,其数据组织格式如下: 之后,在地图上

上海二手房8月排名:链家、悟空找房、中原、太平洋、我爱我家、易居、房天下、iwjw、房多多、房好多、q房网、、、

链家称王 房多多领跑电商平台 近日,云房数据公布了8月上海房产中介成交数据,从排行榜来看,前五名分别为,总计占上海二手房市场份额达41%. 具体来看,老牌中介方面,链家德佑8月成交9864套遥遥领先,占据上海市场五分之一份额:互联网电商平台方面,房多多本月共成交1406套二手房,一举超越房天下,成为电商中介平台的领头羊.此外,志远本月3057套销售,升至第二名,成为本月最大黑马. TOP10企业占上海二手房市场份额过半 据云房数据统计,2016年8月上海二手房住宅共成交52380套.根据交易方式

【OC学习-22】协议和代理双剑合璧——中介找房的代理模式

(1)什么是协议 协议其实是一种接口,创建出来给类(类1)调用,而其他类(类2)可以通过这个协议可以和类1进行通信.所以说它类似于一种接口,实现类和类之间的互动. (2)创建协议 通过New File >>> Objective-C protocol创建.只生成一个.h文件.在这个.h文件里面写方法,分两种@required和@optional,一个是必须实现的方法,另一个是可选实现的方法,默认是required,这种分类方法类似于实例变量的分类. #import <Foundat