Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
对拍了 k<=10&&n<=10000的所有数据没发现错误,然后把所有用int的地方换成long long 就A了,现在还不知道怎马回事呢!!附Accepted代码Source Code Problem: 3531 User: JiaJunpeng Memory: 168K Time: 32MS Language: C++ Result: Accepted Source Code #include<iostream> #include<cstdlib> #include<algorithm> #include<cmath> #include<stdio.h> #include<cstring> using namespace std; long long k,len,wei,w,we[101],di[101],cnt,cont; char str[101]; long long n,ans,ex[101],temp,f[101],an; long long com(long long len) { long long i,j,s,p,q; long long res=0; wei=w=0; for(i=1;i<len;i++) { for(j=1;j<k;j++) { if(i%2) { if(k%2||i==1) { temp=j; if(wei%2) res-=temp; else res+=temp; } } else { temp=(long long)j*ex[i-1]; if(wei%2) res-=temp; else res+=temp; } wei+=((long long)i*ex[i-1])%2; wei%=2; } if(i>1) w+=((long long)(i-1)*(long long)(k-1)*ex[i-2])%2; w%=2; for(j=1;j<i;j++) { temp=0; for(s=0;s<k;s++) { if(i%2) { if(k%2||j==1) { if((w+s*i%2+i-j)%2) temp-=s; else temp+=s; } } else { if((w+i-j)%2) temp-=(long long)s*ex[j-1]; else temp+=(long long)s*ex[j-1]; } } if(i%2==0||k%2==0) res+=temp*(long long)(k-1)*ex[i-j-1]; } } for(i=1;i<len;i++) { f[i]=0; for(j=1;j<=i;j++) { temp=0; for(s=0;s<k;s++) { if(len%2) { if(ex[j-1]%2) { if((i-j+s)%2==0) temp+=s; else temp-=s; } } else { if((i-j)%2==0) temp+=(long long)s*ex[j-1]; else temp-=(long long)s*ex[j-1]; } } if(len%2==0||k%2==0) f[i]+=temp*ex[i-j]; else if(ex[i-j]%2) f[i]+=temp; } } return res; } int main() { long long i,j,s,p,q,nn; while(scanf("%d%s",&k,str)==2) { len=strlen(str); ex[0]=1; for(i=1;i<=len;i++) ex[i]=(long long)k*ex[i-1]; f[0]=0; ans=com(len); n=0; temp=0; for(i=0;i<len;i++) { long long jmin,jmax; if(i==0) jmin=1; else jmin=0; if(i==len-1) jmax=str[i]-'0'; else jmax=str[i]-'0'-1; for(j=jmin;j<=jmax;j++) { long long tem; if(i%2==0) tem=temp+j; else tem=temp-j; long long orz=(n+ex[len-i-1]*(long long)j%2-ex[len-1]%2)*(long long)len%2; orz+=wei; orz%=2; if(len%2) { if(ex[len-1-i]%2) { if(orz%2==0) ans+=tem; else ans-=tem; } } else { tem*=ex[len-1-i]; if(orz%2==0) ans+=tem; else ans-=tem; } orz+=(i+1)%2; if(orz%2) ans-=f[len-i-1]; else ans+=f[len-i-1]; } if(i%2==0) temp+=str[i]-'0'; else temp-=str[i]-'0'; n+=(long long)(str[i]-'0')*ex[len-i-1]; } printf("%I64d\n",ans); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator