洛谷P3795 钟氏映射
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; }