
这个题目刚看到的时候我是感觉比较吓人的,更像是一道数学推理题,然后需要我们根据题目条件进行推理,我们要想着它题目数值那么大,肯定是存在套路的。
n=2025n=2025n=2025,AAA 是 1∼20251\\sim 20251∼2025 的排列;
对任意 i,ji,ji,j,满足
AiAj≤i⋅j+2025A_iA_j \\le i\\cdot j + 2025AiAj≤i⋅j+2025
代入 i=ji=ji=j,得到单位置必要条件
Ai2≤i2+2025A_i^2 \\le i^2+2025Ai2≤i2+2025
当 i>1012i>1012i>1012,也就是 i≥1013i\\ge 1013i≥1013,(i+1)2>i2+2025(i+1)^2>i^2+2025(i+1)2>i2+2025,因此 AiA_iAi 不能大于 i。
推导结论
当 i≥1013i\\ge 1013i≥1013,必须 Ai=iA_i=iAi=i,无交换余地。
1∼10121\\sim10121∼1012:每一对可以选择原地不动,或者交换 (k,k+1)(k,k+1)(k,k+1),共 1012 个独立二元选择。
总方案数:
ans=21012(mod109+7)\\text{ans}=2^{1012}\\pmod{10^9+7}ans=21012(mod109+7)
这个题目的推导过程我也是思考了好久才明白的,可能这样子理解就会简单点,f(x)=x2+2025f(x)=\\sqrt{x^2+2025}f(x)=x2+2025,这是一个单调递增的函数。当 xxx 在增大的过程中,常数 202520252025 的影响会变小,函数最终趋近于
f(x)=xf(x)=xf(x)=x

C++代码
#include <iostream>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7;
int main()
{
LL ret = 1;
for(int i = 1; i <= 1012; i++)
{
ret = ret * 2 % mod;
}
cout << ret << endl;
return 0;
}


