洛谷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;
}
原文地址:https://www.cnblogs.com/huibixiaoxing/p/7007110.html