求助!!!90分,其一超时
  • 板块灌水区
  • 楼主Healer_Fang
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/6/20 18:12
  • 上次更新2024/6/20 20:54:57
查看原帖
求助!!!90分,其一超时
1020865
Healer_Fang楼主2024/6/20 18:12

[NOIP2006 普及组] 数列

题目描述

给定一个正整数 kk(3≤k≤153\leq k\leq 15),把所有 kk 的方幂及所有有限个互不相等的 kk 的方幂之和构成一个递增的序列,例如,当 k=3k = 3 时,这个序列是:

1,3,4,9,10,12,13,…1, 3, 4, 9, 10, 12, 13, \ldots

(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…)

请你求出这个序列的第 NN 项的值,用 1010 进制数表示。

例如,对于 k=3k = 3,N=100N = 100,正确答案应该是 981981。

输入格式

两个由空格隔开的正整数 k,Nk, N(3≤k≤153\leq k\leq 15,10≤N≤100010\leq N\leq 1000)。

输出格式

一个正整数。整数前不要有空格和其他符号。

样例 #1

样例输入 #1

3 100

样例输出 #1

981

提示

NOIP 2006 普及组 第四题

#include<bits/stdc++.h>
#define re register
#define ull unsigned long long
using namespace std;
int k,n,p;
ull a[1000],f[2000000];
inline int read() {
    int k=1;
    int sum=0;
    char c=getchar();
    for(;'0'>c || c>'9';c=getchar())
        if(c == '-') k = -1;
    for(; '0' <= c && c <= '9'; c = getchar())
        sum = sum * 10 + c - '0';
    return sum * k;
}
inline void out(int x)    {
    if(x < 0) { putchar('-'); x *= -1; }
    if(x > 9) out(x / 10);
    putchar(x % 10 + '0');
}
inline ull quick_pow(int r,int k) {
	ull base=r,ans=1;
	while(k!=0)
	{
		if(k&1) ans=ans*base;
		base=base*base;
		k/=2;
	}
	return ans;
}
int main(){
	k=read();n=read();
	a[0]=1;a[1]=k;
	for(re int i=2;i<=n;i++) a[i]=quick_pow(k,i);  
	for(re int i=1;i<=n;i++)
	{
		f[i]=a[p];p++; 	
		ull tmp=f[i];	
		int h=i;	
		if(i>1)
		{
			for(re int j=1;j<h;j++) 
			{	
				f[++i]=tmp+f[j];
				if(i>=n)
				{
					cout<<f[n];	 
					return 0;
				}
			}
		}
	}
	out(f[n]);
	return 0;
}

2024/6/20 18:12
加载中...