题目链接点,,,,不想给了。。
这题真的是跪烂啊,,怎么想出这种解法的,,无敌,,,
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define INFLL 0x3f3f3f3f3f3f3f3f #define FIN freopen("input.txt","r",stdin) #define mem(x,y) memset(x,y,sizeof(x)) typedef unsigned long long ULL; typedef long long LL; #define fuck(x) cout<<"x"<<endl; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef pair<pair<int,int>,int> PIII; typedef pair<int,int> PII; const double eps=1e-6; const int MX=1e5+5; const int P=23333333; int n,m; int tmp[400]; int dp1[2][MX]; int dp2[2][MX]; int ssum[MX]; int main() { while(cin>>n) { m=sqrt(n+0.5); int sum=0,t=0; mem(dp1,0); dp1[1][0]=dp1[0][0]=1; for(int i=1; i<=m; i++) { mem(tmp,0); sum+=i*i; for(int j=0; j<=min(sum,n); j++) { tmp[j%i]=(tmp[j%i]+dp1[t^1][j])%P; dp1[t][j]=tmp[j%i]; if(j-i*i>=0)tmp[(j-i*i)%i]=(tmp[(j-i*i)%i]-dp1[t^1][j-i*i]+P)%P; } t^=1; } mem(dp2,0); mem(ssum,0); dp2[1][0]=1; ssum[0]=1; t=0; //cout<<m<<endl; for(int i=1; i<=m; i++) { for(int j=m+1; j<=n; j++) { dp2[t][j]=((j-i>=0?dp2[t][j-i]:0)+dp2[t^1][j-m-1])%P; // if(j==16) cout<<i<<" "<<dp2[t][j]<<endl; ssum[j]=(ssum[j]+dp2[t][j])%P; } dp2[1][0]=0; t^=1; } int ans=0; t^=1; for(int i=0; i<=n; i++) { ans=(ans+(LL)dp1[t][i]*ssum[n-i])%P; } cout<<ans<<endl; } return 0; }