zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
    
  • 相关阅读:
    axis2的wsdl无法使用eclipse axis1插件来生成client--解决方法
    引用的存在价值
    阿里亲心小号实測
    UVA 1328
    XMPP 协议工作流程具体解释
    10g异机恢复后EM无法启动故障处理一例
    JVM 内存
    abstract class和interface有什么区别?
    ArrayList 如何增加大小
    IndexOutOfBoundsException ArrayList 访问越界
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/7007110.html
Copyright © 2011-2022 走看看