2017.4.19 数列 思考记录

来源:互联网 发布:淘宝小号注册机 编辑:程序博客网 时间:2024/06/07 00:06

        这个题还是挺好的,虽然搞了半天    

        这个题特殊性质挺多的,抓住一个就好办了

           首先  对于后面的次方数,前面的数的和肯定小于后面的一个次方数

           所以没一个次方数的前面和后面一个都是独立的   可以考虑递推(其实就是半枚举)

           然后由于加入一个数肯定是 递增的加前面的数的和  ,算出来的数也是递增的,所以直接把和放在后面即可,就不用排序了

                

码:

#include<iostream>#include<cstdio>using namespace std;long long f[3001],fang[3001],cnt,k,n,i,j;int main(){scanf("%lld%lld",&k,&n);    fang[0]=1;for(i=1;i<=n&&fang[i-1]<=2100000000;i++){fang[i]=fang[i-1]*k;}f[0]=1; f[1]=0;cnt=0;for(i=0;i<n;i++){int lin=f[0];for(j=1;j<=lin;j++){  ++cnt;  f[++f[0]]=f[j]+fang[i];  if(cnt==n)  {  printf("%lld",f[f[0]]);  return 0;           }}}}



似乎还有一种更简单的方法,就是直接转成2进制数、、

原理同上,利用二进制的1 0表示有无,满位进一的特性,可以轻松求出、、



码:

#include<iostream>#include<cstdio> using namespace std;long long k,n,f[3001],i,j,lin,cnt,ci,ans;int main(){scanf("%lld%lld",&k,&n);f[0]=1;for(i=1;i<=n&&f[i-1]<=2100000000;i++){f[i]=f[i-1]*k;}ci=0;while(n!=1){ans+=f[ci]*(n%2);n/=2;++ci;}ans+=f[ci];printf("%lld",ans);} 





0 0
原创粉丝点击