大搬家
Accepts: 1516
Submissions: 6288
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
因为其实要找的数串是这样的,比如:
12345->21435
你发现没,如果1对应2,那么2必须对应1,3对应4,4必须对应3,那5就只能对应5了,就是找123.....N有多少个这样的对应关系,所以呀,要用组合数学中的加法原理,对于某一个数有两种情况,对应自己或者对应其他数,如果对应自己,那么剩下的就只有N-1个数了,如果对应的是别的数,那么被对应的数必须对应它,这样就只剩下N-2个数了,而这个数可以对应的其他数有N-1个,所以呀,f(n)=f(n-1)+(n-1)*f(n-2)
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define ll long long
const int mod = 1e9+7;
const int N = 1e6+5;
ll a[N];
void fun()
{
a[0] = a[1] = 1;
for (int i = 2; i <= N - 5; i++)
{
a[i] = (a[i - 1] + (i - 1) * a[i - 2]) % mod;
}
}
int main()
{
fun();
int t;
cin >> t;
int cnt = 1;
while (t--)
{
int n;
cin >> n;
printf("Case #%d:\n", cnt++);
printf("%lld\n", a[n]);
}
return 0;
}
搜索
复制