能看男女做那个的网站,wordpress电影自动采集主题,自建网站视频教程,深圳市工程交易服务主页文章目录题目描述题解#xff1a;代码传送时间限制#xff1a;C/C 1秒#xff0c;其他语言2秒 空间限制#xff1a;C/C 131072K#xff0c;其他语言262144K 64bit IO Format:%lld 题目描述 求所有长度为n的01串中满足如下条件的二元组个数#xff1a; 设第i位和第j位分别…
文章目录题目描述题解代码传送时间限制C/C 1秒其他语言2秒 空间限制C/C 131072K其他语言262144K 64bit IO Format:%lld 题目描述 求所有长度为n的01串中满足如下条件的二元组个数 设第i位和第j位分别位ai和ajij则ai1,aj0。 答案对1e97取模。 输入描述: 输入一个n。 输出描述: 输出答案对1e97取模 示例1 输入
3输出
6说明 备注: n 1018
题解
就是一个求逆序对 我们看如果1后面有5个0就能构成5个逆序对 也就是我们考虑任意两个位置只要前面是1后面是0无论其他位置是什么数都能构成一个逆序对。而这样的情况有多少种就说明有多少逆序对 接下来我们就要用到组合排列 在n个位置任选两个位置的方案数C2n , 其他n-2个位置就是放0和1随便放那就是n-2个2相乘就是2n-2,所以总逆序对是C2n* 2n-2
C2n* 2n-2n*(n-1)/2 *2n-2 n *(n-1)*2n-3
因为n可以很大所以要用到快速幂 n1要特判一下 我提交后一直卡在95%原来当n2时程序就死循环了所以n2也要特判
代码
#includebits/stdc.h
using namespace std;
const long long mod1e97;
typedef long long ll;ll poww(ll a,ll b)
{ll sum1;while(b){if(b1)sumsum*a%mod;aa*a%mod;b1;}return sum;
}
int main()
{ll n;scanf(%lld,n);if(n1){cout0;return 0;}if(n2){cout1;return 0;}cout( ( ( n%mod )* ( ( n-1 ) % mod ) %mod )*(poww(2ll,n-3)%mod))%modendl;
}