列表

详情


NC245517. 抱歉,这没有集美

描述

众所周知,集美大学的新生开学仪式(并不)是这样的:
  1. 今年预计招收n名新生,将他们依次按照编号。
  2. 拿来n个球,也是按照编号,然后将其打乱后发放给新生,第i位新生分到的球编号为p_i
  3. 若对于某个一个编号为i的新生,gcd(p_i,i)为偶数,则被认定为天选之子,他将会变身为集美。其中表示xy的最大公约数。
Tenshi是集美大学2023年的新生,他酷爱女装,所以他一直梦想变成集美。因为出于对新生隐私的保护,贝贝并不知道Tenshi的编号,他想先计算下有多少种发球方案能让Tenshi变身为集美的概率不为0(即一个方案至少存在一个位置能变身集美,则概率就不为0)。

输入描述

仅一行,包含一个整数,表示新生的数量。

输出描述

输出一行,包含一个整数,如题意所示,答案取模

示例1

输入:

4

输出:

20

说明:

20种方案依次为:
1, 2, 3, 4
1, 2, 4, 3
1, 3, 2, 4
1, 3, 4, 2
1, 4, 2, 3
1, 4, 3, 2
2, 1, 3, 4
2, 3, 1, 4
2, 4, 1, 3
2, 4, 3, 1
3, 1, 2, 4
3, 1, 4, 2
3, 2, 1, 4
3, 2, 4, 1
3, 4, 1, 2
3, 4, 2, 1
4, 1, 3, 2
4, 2, 1, 3
4, 2, 3, 1
4, 3, 1, 2

示例2

输入:

114514

输出:

731904262

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 22ms, 内存消耗: 7412K, 提交时间: 2022-11-05 13:24:46

#include <bits/stdc++.h>
using namespace std;
long long n, a[1<<20] = {1}, mod = 1e9 + 7;
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
		a[i] = a[i-1] * i % mod;
	cout << ((a[n] - a[n+1>>1] * a[n+1>>1] % mod) + mod) % mod;
}

C++(clang++ 11.0.1) 解法, 执行用时: 22ms, 内存消耗: 7376K, 提交时间: 2022-12-06 11:05:19

#include<bits/stdc++.h>
using namespace std;
long long n,a[1<<20]={1},mod=1e9+7;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	a[i]=a[i-1]*i%mod;
	cout<<((a[n]-a[n+1>>1]*a[n+1>>1]%mod)+mod)%mod;
}

Python3 解法, 执行用时: 402ms, 内存消耗: 4648K, 提交时间: 2022-11-15 16:05:12

p=int(1e9+7)
n=int(input())
a=b=1
for i in range(1,(n+3)//2): a=a*i%p 
for i in range(1,n+1): b=b*i%p 
print((b-a*a)%p)

上一题