P3795 钟氏映射
题目背景
2233年,CSSYZ学校的数学老师兼数学竞赛顾问钟JG已经2200+岁啦!
为了庆生,他或她给广大人民群众出了道题。
题目描述
设集合
设为到的映射。
求满足:
的不同的映射的个数,由于答案较大,输出答案对取余的数即可。
输入输出格式
输入格式:输入一个正整数
输出格式:输出满足的不同的映射的个数对取余得到的数。
输入输出样例
输入样例#1:
3
输出样例#1:
4
说明
四个映射分别为:
f(1) | f(2) | f(3) |
---|---|---|
1 | 2 | 3 |
1 | 3 | 2 |
2 | 1 | 3 |
3 | 2 | 1 |
数据范围:
对于20%的数据,
对于其它的80%的数据,
内存20MB...(一开始开1MB把自己坑了)
被所谓的“数论”题坑了进来
f[i]表示i个元素的方案数
对于第i个元素,他可以自己影射自己,有f[i - 1]种方案
他也可以映射其他(i - 1)个人中的某一个,而那个人必须映射第i个元素,因此这两个元素固定下来,有f[i - 2]种方案。
滚起来就可以了。
#include <bits/stdc++.h>
const int MAXN = 5000 + 10;
const int MOD = 14233333;
inline void read(long long &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
inline void swap(long long &a, long long &b){long long tmp = a;a = b;b = tmp;}
long long a,b,c,n;
int main()
{
read(n);
a = 1;b = 2;c = 4;
if(n == 1)printf("%lld", a);
else if(n == 2)printf("%lld", b);
else if(n == 3)printf("%lld", c);
else
{
for(int i = 3;i <= n;i ++)
{
c = (b + (i - 1) * a) % MOD;
swap(b,c);
swap(a,c);
}
printf("%lld", b % MOD);
}
return 0;
}