补充上一篇的第二道题
【问题描述】
一家连锁旅馆在全国拥有 2025 个分店,分别编号为 1 至 2025。随着节日
临近,总部决定为每家分店设定每日客流量的上限,分别记作 A1, A2,. . . , A2025。
这些上限并非随意分配,而是需要满足以下约束条件:
1. A1, A2,. . . , A2025 必须是 1 至 2025 的一个排列,即每个 Ai 均是 1 至 2025
之间的整数,且所有 Ai 互不相同。
2. 对于任意分店 i 和 j(1 ≤ i, j ≤ 2025,i 可等于 j),它们的客流量上限 Ai
和 Aj 的乘积不得超过 i × j +2025。
这些约束旨在平衡各分店客流压力,确保服务质量和运营稳定性。
现在,请你计算这样的分配方案究竟有多少种。由于答案可能很大,你只
需输出其对 10^9 +7 取余后的结果即可。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
解法:根据我们上一篇的全排列代码, 我们会发现当n取不同值的时候, 分配方案x是有规律的
n=10,x=16
n=9,x=16
n=8,x=8
n=7,x=8
n=6,x=4
n=5,x=4
n=4,x=2
n=3,x=2
n=2,x=1
n=1,x=12025 -> 2024+1
等比:1 2 4 8 16 —> 1012
最后一位:2^1012然后我们用快速幂跑一下即可, 结果是781448427
#include <bits/stdc++.h>
using namespace std;
const int Mod=1e9+7;
int main() {
long long a=2; int n=1012;
long long res=1;
while(n){
if(n&1) res=res*a%Mod;
a=a*a%Mod;
n>>=1;
}
cout<<res<<endl;
return 0;
}
简单解释一下, 快速幂这个技巧
a^n=a*a*a....a, 一个一个乘的话, 时间复杂度是O(n)的
快速幂使用二进制拆分和倍增的思想, 仅需要O(logn)的时间
对 n进行二进制拆分, 例如, 3^13=3^(1101)=3^8 * 3^4 * 3
对a做平方倍增, 例如, 3^1, 3^2 , 3^3....3^8
n有⌊logn⌋+1个二进制位, 我知道了a^1,a^2,a^4,a^8,....a^(2^logn)后, 只需要计算 logn+1 次乘法就可以了
快速幂和取模结合的话, eg: (3^13)%p=((3^8)%p*(3^4)%p*(3^1)%p)%p
通用公式:
(((a%c*b%c)%c)%c*d%c)%c=(a*b*d)%c
int quPow(long long a,int n,int p){
int res=1;
while(n){
if(n&1) res=res*a%p;
a=a*a%p;
n>>=1;
}
return res;
}
感谢大家的点赞和关注,你们的支持是我创作的动力!