• codeforces 1391C


    如果 (a_i) 两边有比 (a_i) 大的数,那么 i 必会向两边连边,
    同时又因为 (a_i) 两边相邻的比 (a_i) 大的数的位置必然会相互连边,所以就构成一个三元环。

    考虑有环的情况太复杂,所以转为考虑无环的情况:
    (a_i) 两边不能同时有比自己大的数,所以整个数列就构成了一个单峰函数。
    于是将最大的数(n)拿出来,剩下的数或在左边,或在右边,
    最终答案就为:

    [n!-2^{n-1} ]

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    #include<stack>
    #include<queue>
    using namespace std;
    typedef long long ll;
    
    const int maxn = 1000010;
    const int mod = 1000000007;
    
    int n;
    
    ll qsm(ll i,ll po){
    	ll res = 1ll;
    	while(po){
    		if(po&1) res = 1ll * res * i % mod;
    		po >>=1 ;
    		i = 1ll * i * i % mod;
    	}
    	return res;
    }
    
    ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }
    
    int main(){
    	n = read();
    	ll jie = 1ll;
    	for(int i=1;i<=n;i++) jie = 1ll * jie * i % mod;
    	
    	jie = (((jie - qsm(2,n-1)) % mod) + mod) % mod;
    	
    	printf("%d
    ",jie);
    	
    	return 0;
    }
    
  • 相关阅读:
    Linux libcurl使用 (收藏)
    公钥和私钥与认证和签名
    fedora下配置ipv6 dns服务器
    SHA1
    linux IP 命令
    SSL/TLS协议簇加解密流程
    MD5算法实现原理
    container_of深入理解
    diff和patch使用指南
    oracle 笔记
  • 原文地址:https://www.cnblogs.com/tuchen/p/13799821.html
Copyright © 2020-2023  润新知