zoukankan      html  css  js  c++  java
  • 杂题 洛谷P2675三角圣地

    题目背景

    国王1带大家到了数字王国的中心:三角圣地。

    题目描述

    不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成。这个倒三角的顶端有一排数字,分别是1~N。1~N可以交换位置。之后的每一行的数字都是上一行相邻两个数字相加得到的。这样下来,最底端就是一个比较大的数字啦!数字王国称这个数字为“基”。国王1希望“基”越大越好,可是每次都自己去做加法太繁琐了,他希望你能帮他通过编程计算出这个数的最大值。但是这个值可能很大,所以请你输出它mod 10007 的结果。

    任务:给定N,求三角形1~N的基的最大值 再去 mod 10007。

    输入输出格式

    输入格式:

     

    一个整数N

     

    输出格式:

     

    一个整数,表示1~N构成的三角形的最大的“基”

     

    输入输出样例

    输入样例#1: 复制
    4
    输出样例#1: 复制
    24
    输入样例#2: 复制
    1125
    输出样例#2: 复制
    700

    说明

    数据:

    20% 0<=N<=100

    50% 0<=N<=3000

    100% 0<=N<=1000000

    样例解释:

    1 3 4 2

    4 7 6

    11 13

    24 是N=4的时候的最大值,当然还有别的构成形式。

    PS:它叫做三角圣地,其实它就是个三角形~

    本题数据已经更新,目前全部正确无误!

    不要面向数据编程!

      这道题是一个最简单的Lucas的板子。但是我由于lucas在调用C(n,m)的时候没有考虑n < m 的情况。可以说非常尴尬。

      都是板子,没什么好讲的,线性跑一遍阶乘的逆元,再直接按组合数乘就行。

      代码如下:

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<algorithm>
     4 #include <iostream>
     5 using namespace std;
     6 typedef long long ll;
     7 const int maxn = 1e6 + 5;
     8 const ll mod = 1e4 + 7;
     9 ll read()
    10 {
    11     ll a = 0,b = 1;
    12     char c = getchar();
    13     while(c < '0' or c > '9')
    14     {
    15         if(c == '-') b = -1;
    16         c = getchar();
    17     }
    18     while(c >= '0' and c <= '9')
    19     {
    20         a = a * 10 + c - '0';
    21         c = getchar();
    22     }
    23     return a * b;
    24 }
    25 ll c[maxn],n,j[maxn],ans,t;
    26 ll quickpow(ll a, ll b)
    27 {
    28     ll base = a;
    29     ll ans = 1;
    30     while(b != 0)
    31     {
    32         if(b %2 == 1){
    33         ans *=base;
    34         ans %= mod;
    35     }
    36         base *= base;
    37         base %= mod;
    38         b/=2;
    39     }
    40     return ans % mod;
    41 }
    42 ll C(ll a, ll b)
    43 {
    44     if(a < b) return 0;
    45     return   j[a] * (c[a-b] * c[b] % mod) % mod;
    46 }
    47 ll lucas(ll a, ll b)
    48 {
    49     if(a < mod && b < mod)
    50         return C(a, b) % mod;
    51     return
    52         C(a % mod, b % mod) * lucas(a / mod, b / mod) % mod;
    53 }
    54 int main()
    55 {
    56 //    freopen("fds.in","r",stdin);
    57 //    freopen("fds.out","w",stdout);
    58     cin >> n;//n = read();
    59     c[0] = 1;
    60     j[0] = 1;
    61     c[1] = 1;
    62     j[1] = 1;
    63     for(int i=2; i<mod; i++)
    64     {
    65         j[i] = j[i-1] * i % mod;
    66     }
    67     c[mod-1] = quickpow(j[mod-1],mod-2) % mod;
    68 
    69     for(int i=mod-2; i>=1; i--)
    70     {
    71         c[i] = (c[i+1] * (i+1)) % mod;
    72     }
    73     for(int i=1; i<=n; i++)
    74     {
    75         ll m = n-1;
    76         if(i %2 == 0) t = i/2 - 1;
    77         else t = i/2;
    78         if(t == 0) ans+=i;
    79         else ans += (lucas(m,t) * (i % mod))%mod;
    80         ans %= mod;
    81         //printf("%d %lld %lld
    ", i, lucas(m,t), ans);
    82         //printf("%d %d %d %d %d
    ",i,t,c[t],c[n-t-1],j[n-1] * (c[t] * c[n-t-1] % mod) % mod);
    83     }
    84     //printf("%I64d",ans);
    85     //cout << ans << endl;
    86     printf("%lld",ans);
    87     return 0;
    88 }
  • 相关阅读:
    Day 29 作业/服务端实现接收客户端的连接并发
    Day 28 操作系统发展/进程
    Day 27 作业(FTP)
    Day 27 subprocess模块/粘包问题以及解决/UDP协议/socketserver
    Day 26 作业
    Day 26 互联网协议/Socket套接字
    Day 22 绑定方法和非绑定方法/isinstance/issubclass/反射/魔法方法/单例模式
    Day 21 作业
    Day 21 组合/封装/property特性/多态和多态性/抽象类/鸭子类型
    day 20 作业
  • 原文地址:https://www.cnblogs.com/qmcp/p/9592318.html
Copyright © 2011-2022 走看看