算法: 代表字母的整形数组组合字符串的可能性

问题描述 已知有一个长度为 26 的整型数组, 分别代表 26 个字母的个数, 问这些字母能组成多少种不同的字符串(取模 1000000007). 问题求解 纯暴力 开始觉得很简单, 纯迭代问题, 抬手就来. int calc(int[] nums) { int ret = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] > 0) { nums[i]--; ret += calc(nums); ret %= 1000000007; nums[i]++; } } return ret > 0 ? ret : 1; } 结果超时, 不行, 看来只能用数学方法求解. 数学方法 $$ Sum=\dfrac{A_{字母总数}^{字母总数}}{A_{A的数量}^{A的数量}\times……\times A_{2}^{2}} $$ 题目没有讲太清楚(是否这些字母一定要全部使用), 这里为了简单就假设全部使用. 解法一:排列组合. 生成字符串长度是 $sum=a_0+a_1+a_2+…+a_{25}$. 放 $a$ , 有$(sum, a0)$种选择的方法; 放$ b$, 有$(sum - a0, a1)$种方法; 放 $c$, 有$(sum - a0 - a1, a2)$种方法…..直到最后 程序 private long solve1(int[] letters) { int sum = 0; for (int c : letters) { sum += c; } BigInteger r = BigInteger.ONE; for (int c : letters) { BigInteger s = choose(sum, c); r = r.multiply(s); sum -= c; } return r.longValue(); } private static BigInteger choose(int n, int k) { BigInteger r = BigInteger.ONE; for (int i=0; i<k; i++) { r = r.multiply(BigInteger.valueOf(n - i)); } for (int i=2; i<=k; i++) { r = r.divide(BigInteger.valueOf(i)); } return r; } 解法 2: EGF (指数生成函数)。 这是个排列问题所以用指数生成函数. ...

2020-09-07 · Moo

clash verge rev设置

PC版本 下载 Clash.Verge_2.2.0_x64-setup.exe 点击安装后, 打开Clash Verge Rev 界面如下 订阅链接 这只是一个工具, 就像我们买了手机还要买SIM卡一样 订阅链接请自行找位置获取. 点击1处的Profiles 在2输入获取到的订阅链接 再点击3来import订阅订阅链接 如果成功的话, 会看到 形如这样的订阅结果 单击这个矩形 使其如图所示, 左边框为蓝色, 意味着被选中了 科学上网 只推荐使用Chrome, Edge, Firefox. 不推荐不建议强烈否定任何国产浏览器 点击Setting后, 将System Proxy置于开启状态, 下面的Port Config设置如图一样为12315 现在打开浏览器, 访问www.google.com, 应该是可以正常访问了. 目前用的是系统代理, 会导致很多其他我们不想代理的应用被代理了, 比如你的下载软件, 游戏客户端等等. 这些不但会损耗流量, 还会拖慢你使用的速度. 规避方法见下文. 关闭系统代理 Chrome浏览器访问https://chromewebstore.google.com/detail/smartproxy/jogcnplbkgkfdakgdenhlpcfhjioidoj?utm_source=ext_app_menu Firefox浏览器访问https://addons.mozilla.org/en-US/firefox/addon/smartproxy/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search 下载安装完成后 按照图片顺序点击, 进入到备份恢复界面 导入下面的json SmartProxy-FullBackup.json 导入后, 点击 始终开启即可. 现在回到Clash的界面 将系统代理(System Proxy关闭) 2是开机自行启动, 3是启动后自动最小化, 按照需求开启. 现在, 应该就可以在不启动系统代理的情况下, 浏览器也能科学上网了. ...