打表出奇迹

题目描述

某人写了n封信和n个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。

解法

#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
int a[110] = {0, 933713113, 930651136, 637937211, 307311871, 322273426, 194914852, 154199209, 389699639, 601739182, 213823357, 498202615, 324300550, 974475946, 467881322, 598680559, 971346692, 617165552, 503709458, 820144401, 82358069, 533047638, 686678173, 34546238, 499126069, 468899710, 581347156, 700529992, 98592091, 988209678, 40661679, 573631136, 710709955, 499158883, 880429710, 333697951, 579797877, 717694718, 31308092, 220854491, 963974981, 705101053, 466289530, 819636314, 464087273, 256789690, 276682441, 340221393, 624766601, 977632075, 402182971};
int b[110] = {1, 62993271, 110068813, 30003579, 815217227, 696682031, 271186377, 263083985, 193236044, 603547817, 314470659, 30970589, 779475632, 160929730, 710833938, 41451389, 235530111, 828311549, 114361629, 18560303, 451755479, 925887595, 691709414, 403307354, 942062491, 827750738, 585243522, 732526640, 672111100, 216078407, 269882629, 404072021, 726729378, 973044862, 489584316, 398578002, 97616593, 320036101, 784749048, 994988983, 365715120, 117821032, 924507115, 925425738, 845309693, 639014656, 214847532, 521564643, 386335069, 771076085, 586902194};
int ans[20000007];
int main()
{//D_{n} = (n-1)(D_{n-1}+F_{n-1})
    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    int n;
    cin>>n;
    const int m=20000000;
    int k=n/m;
    if(k!=0){n = n - (k * m - 1);}
    ans[1] = a[k], ans[2] = b[k];
    for(int i = 3; i <= n; i ++){
        ans[i] = (long long)(i - 1 + (k ? k * m - 1 : 0)) * (ans[i - 2] + ans[i - 1]) % MOD;
    }
    cout << ans[n] << endl;
}

打表,会卡long long

错排数问题:

公式:D_n = (n-1)(D_{n-1}+D_{n-2})

像不像斐波拉契?Fn=F{n-1}+F{n-2}(n>2)

那可不可以简化?D_n = (n-1)(D_{n-1}+F_{n-1})

呜呜呜,考试坐大牢呜呜呜

哇哇哇哇哇哇哇哇哇哇哇哇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值