zoukankan      html  css  js  c++  java
  • 牛客小白月赛6 J 洋灰三角 数学

    链接:https://www.nowcoder.com/acm/contest/136/J
    来源:牛客网

    题目描述

        洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥、混凝土。
        WHZ有很多铸造成三角形的洋灰块,他想把这些洋灰三角按照一定的规律放到摆成一排的n个格子里,其中第i个格子放入的洋灰三角数量是前一个格子的k倍再多p个,特殊地,第一个格子里放1个。
        WHZ想知道把这n个格子铺满需要多少洋灰三角。

    输入描述:

    第一行有3个正整数n,k,p。

    输出描述:

    输出一行,一个正整数,表示按照要求铺满n个格子需要多少洋灰三角,由于输出数据过大,你只需要输出答案模1000000007(1e9+7)后的结果即可。
    示例1

    输入

    复制
    3 1 1

    输出

    复制
    6

    说明

    洋灰三角铺法:1 2 3,总计6个
    示例2

    输入

    复制
    3 2 2

    输出

    复制
    15

    说明

    洋灰三角铺法:1 4 10,总计15个
    示例3

    输入

    复制
    3 3 3

    输出

    复制
    28

    说明

    洋灰三角铺法:1 6 21,总计28个

    备注:

    对于100%的测试数据:
    1 ≤ n ≤ 1000000000
    1 ≤ k,p ≤ 1000

    分析:
      k=1时:
      f(n)为等差数列,S(n)=n*(n-1)/2*p+n

      k!=1时:
      f(n) = k*f(n-1)+p

      S(n)=f(1)+f(2)+...+f(n)=1+k+k^2+...+k^(n-1)+k^(n-2)*p+2*k^(n-3)*p+...+(n-2)*k*p+(n-1)*p
      =(k^n-1)/(k-1)+p*(k^n-1)/(k-1)^2-p*n/(k-1)=(1+p/(k-1))*(k^n-1)/(k-1)-p*n/(k-1)
    S(n)求解过程:
    第一部分S1=f(1)+f(2)+...+f(n)=1+k+k^2+...+k^(n-1)是个等比数列直接用等比数列求和公式求
    后面一部分S2=k^(n-2)*p+2*k^(n-3)*p+...+(n-2)*k*p=p*(k^(n-2)+2*k^(n-3)+...+(n-2)*k)
    考虑求g(n)=k^(n-2)+2*k^(n-3)+...+(n-2)*k
    设f(n)=k^(n-1)+k^(n-2)+...+k^2
    则f'(n)=(n-1)*k^(n-2)+(n-2)*k^(n-3)+...+2*k
    所以:n*f(n)/k = n*k^(n-2)+n*k^(n-3)+...+n*k
    所以:n*f(n)/k-f'(n)=k^(n-2)+2*k^(n-3)+...+(n-2)*k
    即 g(n)=n*f(n)/k-f'(n)
    f(n)的式子为等比数列可根据等比数列求和公式得出,f'(n)为f(n)的求导式
    最后一部分:(n-1)*p
    三部分相加就是S(n)的结果了
    AC代码:
    #include <map>
    #include <set>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <bitset>
    #include <cstring>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #define ls (r<<1)
    #define rs (r<<1|1)
    #define debug(a) cout << #a << " " << a << endl
    using namespace std;
    typedef long long ll;
    const ll maxn = 1e6+10;
    const ll mod = 1e9+7;
    const double pi = acos(-1.0);
    const double eps = 1e-8;
    ll qow( ll a, ll b ) {
        ll ans = 1;
        while( b ) {
            if( b&1 ) {
                ans = ans*a%mod;
            }
            a = a*a%mod;
            b /= 2;
        }
        return ans;
    }
    int main() {
        ios::sync_with_stdio(0);
        ll n, k, p;
        while( cin >> n >> k >> p ) {
            if( k == 1 ) {
                cout << (n-1)*n/2*p+n << endl;
            } else {
                ll ans=(1+p*qow(k-1,mod-2)%mod)%mod*((qow(k,n)-1+mod)%mod)%mod*qow(k-1,mod-2)%mod;
                ans=(ans-p*qow(k-1,mod-2)%mod*n%mod+mod)%mod;
                cout << ans << endl;
            }
        }
        return 0;
    }
    

      

    彼时当年少,莫负好时光。
  • 相关阅读:
    深入js——this
    深入js——作用域链
    深入js——变量对象
    深入js——执行上下文栈
    vue为什么不能检测数组的变化
    常用的文件下载方式
    vue中修改第三方组件的样式不生效
    Neo4j 学习笔记2
    Neo4j 学习笔记1
    idea git 命令
  • 原文地址:https://www.cnblogs.com/l609929321/p/9500814.html
Copyright © 2011-2022 走看看