萌新求助 TLE

P4317 花神的数论题

改掉两处(已注释),因为res可能会等于0,所以设置为0的记忆化过程会重叠而没有达到记忆化的效果 ```cpp #include<bits/stdc++.h> #define int long long #define mod 10000007 using namespace std; int n,ans=1,len,a[55],f[55][55]; int power(int x,int y,int p) { int ans=1; while(y) { if(y%2)ans=ans*x%p; y/=2; x=x*x%p; } return ans%p; } int dfs(bool limit,int pos,int sum,int num) { if(pos==0)return sum==num; if(!limit&&f[pos][sum]!=-1)return f[pos][sum];//1 int res=0; int up=limit?a[pos]:1; for(int i=0;i<=up;i++)res+=dfs(limit&(i==a[pos]),pos-1,sum+(i==1),num); if(!limit)f[pos][sum]=res; return res; } int ask(int k,int num) { len=0; while(k) { a[++len]=k%2; k/=2; } memset(f,-1,sizeof(f));//2 return dfs(1,len,0,num); } signed main() { scanf("%lld",&n); for(int i=1;i<=50;i++)ans=ans*power(i,ask(n,i),mod)%mod; printf("%lld",ans); return 0; } ```
by Usada_Pekora @ 2021-11-12 17:31:58


|