【codevs 5251】WYW的数字金字塔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Loi_Shirley/article/details/78312034

题目描述 Description

wyw有一个数字n,他要用这个数字写出一个数字金字塔。

wyw用随机数生成器生成了一个小于n且大于1的正整数k。

wyw找来一张白纸,他在白纸的最低端写下了这个数字n。

wyw在n的上面紧挨着写下了一个正整数a1,a1满足不大于n/k,

wyw又在a1上面写下了一个正整数a2,满足a2不大于a1/k,

时间过了t…

wyw在ah-1的上面写下了一个正整数ah,满足ah不大于ah-1/k

wyw已经无法在ah的上方写出不大于ah/k的数字了

这时,wyw就已经写好了一个高度为h的数字金字塔

wyw可以按照这个规则写出好多符合条件的数字金字塔。

试问:wyw一共能够写出多少种数字金字塔?wyw能写出的所有的数字金字塔中最高的金字塔的高度是多少?

注意:由于答案可能较大,所以对每一组数据请输出答案对p取模后的值

输入描述 Input Description
输入数据的第一行包含两个正整数T、p,表示有T组测试数据,p的意义如题目所述

后面跟着T组数据,每组数据仅一行,包含了一个正整数n和k,意义如题目所述

输出描述 Output Description
输出数据一共n行,每行两个整数,表示答案对p取模后的值

样例输入 Sample Input
2 2

6 2

20 3

样例说明:以20 3这组数据为例,wyw能写出的所有金字塔如下
这里写图片描述

因此答案是7 3,对2取模后输出1 1

样例输出 Sample Output
1 1

1 1

数据范围及提示 Data Size & Hint
这里写图片描述

一个神奇的递推递归
找规律,对于每层,方案数为i/k

数据很大,会爆int

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define RI register int
#define LL long long
using namespace std;
const int MAXN = 10000002;
LL n,k,T,p,num[MAXN],s[MAXN];

inline LL read()
{
    char ch = getchar();
    LL f = 1, x = 0;
    while(!(ch >= '0' && ch <= '9')){if(ch == '-')f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9') {x = x * 10 + (ch - '0');ch = getchar();}
    return x * f;
} 

int main(){
    T = read(),p = read();
    while(T --){
        n = read(),k = read();LL nnn = n,cnt = 0;
    //  memset(num,0,sizeof(num)),memset(s,0,sizeof(s)); 
    //  加了就TLE(* ̄︶ ̄) 
        s[0] = s[1] = num[1] = 1;
        for(RI i = 2; i <= n / k; i ++)
            num[i] = s[i / k],s[i] = s[i - 1] + num[i],s[i] %= p;
        while(true){if(n) cnt ++; else break; n /= k;}
        printf("%lld %lld\n",(s[nnn / k] % p),(cnt % p));
    }
    return 0;
}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页