题意:
看上面的式子
题解:
将y这个数分为两半,先处理后一半,然后枚举后一半再二分查找前一半,判断是否可以满足上面的式子
题目卡时间看的很气,数组开 long long 不行,会超时
并且再指数次方的那里需要预处理,并且不能先处理前一半,因为后一半和前一半有乘以100000的一个关系,利用好又可以减少时间
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 100005 #define LL long long int a[maxn],sum[20][20],num[maxn]; int main() { for(int i=1;i<10;i++){ sum[i][0]=1; for(int j=1;j<=9;j++){ sum[i][j]=sum[i][j-1]*i; } } int T; int cases=1,x,k,temp,pos; //freopen("in.txt","r",stdin); scanf("%d",&T); while(T--) { LL t; pos=0; scanf("%d%d",&x,&k); memset(num,0,sizeof(num)); for(int i=1;i<100000;i++){ temp=i; while(temp) { num[i]+=sum[temp][k]; temp/=10; } a[pos++]=num[i]-i; } sort(a,a+pos); LL ans=0; for(LL i=0;i<100000;i++){ t=num[i]-i*100000; t=x-t; temp=lower_bound(a,a+pos,t)-a; while(a[temp]==t&&temp<pos) ans++,temp++; } printf("Case #%d: %lld\n",cases++,ans); } return 0; }