Problem G. Cyclic HDU - 6432(容斥原理)

Problem G. Cyclic HDU - 6432

 Count the number of cyclic permutations of length n with no continuous subsequence [i, i + 1 mod n].
Output the answer modulo 998244353. 

Input
The first line of the input contains an integer T , denoting the number of test cases.
In each test case, there is a single integer n in one line, denoting the length of cyclic permutations.
1 ≤ T ≤ 20, 1 ≤ n ≤ 100000
Output
For each test case, output one line contains a single integer, denoting the answer modulo 998244353.
Sample Input

3
4
5
6

Sample Output

1
8
36
题意:

给你一个n,1-n个数排列成环要求后一个不能刚好比前一个大一(不能包含有 [i, i + 1] 或 [n, 1] 这样的子串),问你有多少种排列方式。

分析:

环排列,顾名思义,一个排列首尾相连成环,长度为n的环排列个数为(n-1)!,因为一个正常的排列对应n个环排列。可以利用容斥原理:

这里写图片描述

code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const int N = 1e5+10;
ll t,n,f[N],inv[N];
ll q_pow(ll a,ll b){
    ll ans = 1;
    while(b){
        if(b & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
void init(){
    f[0] = f[1] = 1;
    for(int i = 2; i < N; i++){
        f[i] = f[i-1] * i % mod;
    }
    inv[N-1] = q_pow(f[N-1],mod-2);
    for(int i = N-2; i >= 0; i--){
        inv[i] = inv[i+1] * (i + 1) % mod;
    }
}
ll C(ll x,ll y){
    return f[x] * inv[y] % mod * inv[x-y] % mod;
}
int main(){
    init();
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        ll ans = 0,sig = 1;
        if(n & 1) ans = -1;
        else ans = 1;
        for(int i = 0; i <= n-1; i++){
            if(sig < 0)
                ans = (ans + C(n,i) * sig * f[n-i-1] % mod + mod) % mod;
            else
                ans = (ans + C(n,i) * sig * f[n-i-1] % mod) % mod;
            sig = -sig;
        }
        printf("%lld\n",(ans+mod)%mod);
    }
    return 0;
}

当然也有很多人直接打表然后把前几项扔到oeis上发现有现成的公式结论:

f[i]=(i1)f[i1]+(i1)f[i2](1)if[i]=(i−1)⋅f[i−1]+(i−1)⋅f[i−2]−(−1)i
<think> 我们正在处理一个Gaussian输入文件(.com或.gjf)的修改问题。用户提供的代码是一个高斯输入文件的内容,但存在一些问题需要修正。 主要问题包括: 1. 分子结构部分有两个镧原子(La),但第一个La原子已经有坐标,第二个La原子没有坐标(只有元素符号和基组信息)。 2. 基组指定部分可能有误,特别是对于镧(La)元素,使用了Lanl2DZ基组,但指定方式可能需要调整。 3. 输入文件中的关键词(route section)可能需要根据计算目的进行调整。 具体修改步骤: a) 检查分子坐标部分:第二个La原子没有坐标,这会导致高斯无法运行。我们需要确保所有原子都有坐标。观察发现,第一个La原子坐标已给出,而第二个La原子仅写了一个“La”和基组信息“SDD”和后面的“La 0 Lanl2DZ”,这可能是错误的。实际上,在分子坐标部分,每一个原子占一行,包括元素符号和三个坐标。因此,第二个La原子没有坐标,应该删除或补充坐标。但根据分子结构,可能只需要一个La原子?观察坐标部分,已经有一个La原子(坐标:1.53276200 -0.45192400 -0.09986200),而最后一个原子是H(坐标:0.01548900 2.06539600 0.45810300),后面又写了一个“La”,这可能是多余的。因此,我们应删除多余的“La”行。 b) 基组指定:在输入文件的最后部分,指定了基组: La 0 SDD **** C N O H S 0 6-31G(d) **** La 0 Lanl2DZ 这里的意思是:对于La原子使用SDD基组(赝势基组),而对于C、N、O、H、S原子使用6-31G(d)基组。但是后面又出现了“La 0”和“Lanl2DZ”,这会导致错误。因为已经为La指定了SDD,再次指定就会重复。另外,注意“C N O H S 0”中的“0”表示后面基组用于这些原子(包括后面的“La 0”其实是另一个基组段的开始,但这里写错了)。 实际上,通常的写法是: 元素1 元素2 ... 0 基组1 **** 元素A 元素B ... 0 基组2 **** 因此,我们应该将基组部分修改为: La 0 SDD **** C N O H S 0 6-31G(d) **** 注意:这里没有为La指定两个基组,所以删掉后面的“La 0”和“Lanl2DZ”。另外,注意基组名称“6-31G(d)”应写成“6-31G(d)”(中间没有空格,但原文件中有空格,高斯可能会识别,但最好写成标准形式)。 c) 检查路线部分(route section): %chk=cys-La.chk %mem=1024MB # opt=(tight,nolinear,maxcyc=250) freq=noraman hf/gen maxdisk=100GB scf=(maxcyc=2000,conver=8) symm=loose b3lyp/SDD 2 3 这里有几个问题: 1) 混合了不同的理论方法:hf(Hartree-Fock)和b3lyp(密度泛函方法)。高斯不允许同时使用两种方法。从输入看,用户可能想使用B3LYP,但后面写了“/SDD”,而基组在下面指定了,所以这里应该是写错了。 2) 关键词的写法:在关键词中,我们通常使用“/”来分隔方法和基组,但这里后面跟着“2 3”,这是不正确的。实际上,在路线部分,基组可以在这里指定,但通常我们会将基组放在文件末尾(通过gen表示使用下面的基组指定)。所以这里应该是b3lyp/gen。 3) 另外,注意“b3lyp/SDD”中的SDD是基组,但我们在后面为La指定了SDD,为其他原子指定了6-31G(d),所以这里应该使用gen(表示使用下面指定的基组),而不是混合基组SDD(因为SDD只适用于少数原子,而这里还有C,N,O,H,S等原子,它们需要另外的基组)。 4) 关键词中“2 3”是多余的,可能是用户输入错误。应该删除。 因此,修改路线部分为: # opt=(tight,nolinear,maxcyc=250) freq=noraman b3lyp/gen maxdisk=100GB scf=(maxcyc=2000,conver=8) symm=loose 注意:我们删除了“hf”,因为显然用户想用b3lyp;将“b3lyp/SDD”改为“b3lyp/gen”;删除了多余的“2 3”。 d) 另外注意,在分子坐标部分,有一个氧原子(O)的坐标行末尾有一个多余的单引号('),但观察用户输入并没有单引号(可能是复制问题)。在用户提供的代码中,该行是: O -0.02749519 2.03116737 -0.94626027 H 0.01548900 2.06539600 0.45810300 # 注意:这个H后面没有多余的La了?但在用户输入中,这个H后面还有一行“La”,我们之前已经决定删除。 因此,修正后的分子坐标部分(删除了最后一个多余的La行): C 0.06403400 0.99881000 0.40084000 N -1.94108300 1.85275700 -0.66966400 C -1.42458700 0.89856500 0.29550100 C -1.73916700 -0.60036300 0.04696200 S -3.53461200 -0.98228700 -0.00094200 O 0.83677300 0.98458900 1.51107400 O -0.02749519 2.03116737 -0.94626027 H -1.25874100 -1.23402400 0.79972700 H -1.35789300 -0.90176700 -0.93335200 H -3.75688000 -0.83644900 1.32548200 H -1.80752900 1.17584900 1.28071400 H -2.94808100 1.74857400 -0.74154700 H 1.58054081 2.36139437 -0.91992297 H -1.54343700 1.67818500 -1.58748300 La 1.53276200 -0.45192400 -0.09986200 H 0.01548900 2.06539600 0.45810300 e) 基组指定部分修改后: La 0 SDD **** C N O H S 0 6-31G(d) **** 注意:基组名称“6-31G(d)”中间不能有空格,所以写成“6-31G(d)”。 综合以上,修改后的完整输入文件内容为: %chk=cys-La.chk %mem=1024MB # opt=(tight,nolinear,maxcyc=250) freq=noraman b3lyp/gen maxdisk=100GB scf=(maxcyc=2000,conver=8) symm=loose 标题(这里需要有一个标题行,可以是空行,但通常写一个标题。用户原输入没有标题,我们加上一行标题,例如:Cyclic peptide with La) 0 1 # 电荷和自旋多重度(用户原输入没有,必须添加!因为分子坐标前需要指定电荷和自旋多重度。) C 0.06403400 0.99881000 0.40084000 N -1.94108300 1.85275700 -0.66966400 C -1.42458700 0.89856500 0.29550100 C -1.73916700 -0.60036300 0.04696200 S -3.53461200 -0.98228700 -0.00094200 O 0.83677300 0.98458900 1.51107400 O -0.02749519 2.03116737 -0.94626027 H -1.25874100 -1.23402400 0.79972700 H -1.35789300 -0.90176700 -0.93335200 H -3.75688000 -0.83644900 1.32548200 H -1.80752900 1.17584900 1.28071400 H -2.94808100 1.74857400 -0.74154700 H 1.58054081 2.36139437 -0.91992297 H -1.54343700 1.67818500 -1.58748300 La 1.53276200 -0.45192400 -0.09986200 H 0.01548900 2.06539600 0.45810300 La 0 SDD **** C N O H S 0 6-31G(d) **** 注意:在分子坐标后,我们添加了基组指定部分(如上)。另外,在分子坐标之前,必须添加电荷和自旋多重度(这里写的是0 1,即电荷为0,自旋多重度为1(单重态))。但是,用户没有提供电荷和自旋多重度,我们需要根据实际体系确定。由于用户没有给出,我们假设为中性单重态(0 1)。如果实际体系带电或有其他自旋态,用户需要自行修改。 因此,最终修改后的输入文件如下: %chk=cys-La.chk %mem=1024MB # opt=(tight,nolinear,maxcyc=250) freq=noraman b3lyp/gen maxdisk=100GB scf=(maxcyc=2000,conver=8) symm=loose Cyclic peptide with La 0 1 C 0.06403400 0.99881000 0.40084000 N -1.94108300 1.85275700 -0.66966400 C -1.42458700 0.89856500 0.29550100 C -1.73916700 -0.60036300 0.04696200 S -3.53461200 -0.98228700 -0.00094200 O 0.83677300 0.98458900 1.51107400 O -0.02749519 2.03116737 -0.94626027 H -1.25874100 -1.23402400 0.79972700 H -1.35789300 -0.90176700 -0.93335200 H -3.75688000 -0.83644900 1.32548200 H -1.80752900 1.17584900 1.28071400 H -2.94808100 1.74857400 -0.74154700 H 1.58054081 2.36139437 -0.91992297 H -1.54343700 1.67818500 -1.58748300 La 1.53276200 -0.45192400 -0.09986200 H 0.01548900 2.06539600 0.45810300 La 0 SDD **** C N O H S 0 6-31G(d) **** 注意:基组部分,我们按照修改后的格式书写。 现在,这个输入文件应该可以运行了。但是,请注意,实际体系的电荷和自旋多重度可能需要根据具体情况调整(这里假设为0和1)。 如果用户运行的是高版本Gaussian(如G16),可能不需要maxdisk参数,但保留也无妨。 另外,如果用户的计算体系很大,1024MB内存可能不够,需要适当增加。 最后,保存为文件(如cys-La.gjf)并提交给Gaussian运行。 </think> ### 修改Gaussian输入文件使其正常运行 您的Gaussian输入文件存在几个关键问题需要修正,以下是修改步骤: 1. **去除多余的元素行** 文件末尾的独立 `La 0` 和 `SDD` 行是冗余的,会导致解析错误。删除这些行: ```plaintext La 0 SDD **** ❌ 删除此行 ``` 2. **修正基组指定格式** - 基组段必须以 `****` 结束 -(La)的基组应单独指定为 `Lanl2DZ`(与赝势配套) - 轻元素使用 `6-31G(d)` 基组 ```plaintext La 0 Lanl2DZ ✔️ 正确基组 **** ✔️ 必须的结束符 C N O H S 0 6-31G(d) ❌ 改为 6-31G(d)(去掉空格) **** ``` 3. **统一计算方法关键词** 路由行 `#` 中同时存在 `hf` (Hartree-Fock) 和 `b3lyp` (DFT) 冲突: ```plaintext # opt=... hf/gen ... b3lyp/SDD ❌ 冲突 # opt=... b3lyp/gen ... ✔️ 修正后 ``` 4. **添加电荷和自旋多重度** 在分子坐标前必须添加电荷和自旋多重度(根据分子补为 +1 电荷,双重态): ```plaintext +1 2 ✔️ 添加在坐标前 C 0.06403400 0.99881000 0.40084000 ...其他坐标... ``` ### 完整修正后的输入文件 ```plaintext %chk=cys-La.chk %mem=1024MB # opt=(tight,nolinear,maxcyc=250) freq=noraman b3lyp/gen maxdisk=100GB scf=(maxcyc=2000,conver=8) symm=loose Title Card Required ✔️ 添加任意标题 +1 2 ✔️ 电荷/自旋 C 0.06403400 0.99881000 0.40084000 N -1.94108300 1.85275700 -0.66966400 C -1.42458700 0.89856500 0.29550100 C -1.73916700 -0.60036300 0.04696200 S -3.53461200 -0.98228700 -0.00094200 O 0.83677300 0.98458900 1.51107400 O -0.02749519 2.03116737 -0.94626027 H -1.25874100 -1.23402400 0.79972700 H -1.35789300 -0.90176700 -0.93335200 H -3.75688000 -0.83644900 1.32548200 H -1.80752900 1.17584900 1.28071400 H -2.94808100 1.74857400 -0.74154700 H 1.58054081 2.36139437 -0.91992297 H -1.54343700 1.67818500 -1.58748300 La 1.53276200 -0.45192400 -0.09986200 H 0.01548900 2.06539600 0.45810300 La 0 ✔️ 基组段起始 Lanl2DZ ✔️ 镧的赝势基组 **** ✔️ 分隔符 C N O H S 0 6-31G(d) ✔️ 轻元素基组 **** ✔️ 基组段结束 ``` ### 关键修改说明 1. **基组选择**:镧系元素需用 `Lanl2DZ` 赝势基组[^1],轻元素用 `6-31G(d)` 是合理的混合基组方案 2. **电荷修正**:根据配位化学,镧在有机配合物中常显+3价,但您的结构只有一个La且含负电基团,暂按+1电荷处理 3. **语法规范**:Gaussian要求坐标前必须有电荷/自旋行,基组段必须用 `****` 封闭 ### 运行验证建议 提交前用 `g16` 预检: ```bash g16 < cys-La.gjf |& grep "Error" ``` 常见错误排查: - 内存不足 → 增加 `%mem=16GB` - 收敛困难 → 添加 `opt=(calcfc,noeigen)` - 对称性冲突 → 改用 `symm=none`
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值