| ||||||||||
| 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 | |||||||||
大家帮忙看看,我的code哪里错了#include<iostream>
#include<stdio.h>
#define MAXN 10000
#define MAXM 100000
#define LIM 10000
#define INF 0x3f3f3f3f
#define FOR(i,l,r) for (i=l;i<=r;i++)
using namespace std;
int i,j,k,l,m,n,ans,cl=0;
static int q[MAXM],c[MAXN],s[MAXN],o[MAXN],b[100];
const int lg[]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};
struct high {
int l,a[100];
high(int ti=0):l(1) {
memset(a,0,sizeof(a));a[1]=ti;
for (;a[l]>=LIM;l++) {
a[l+1]+=a[l]/LIM;a[l]%=LIM;
}
}
void demo() {
for (int i=1;i<=l;i++) printf("%d ",a[i]);
printf("\n");
}
void operator += (high ot) {
l=max(l,ot.l);
for (int i=1;i<=l;i++)
if ((a[i]+=ot.a[i])>=LIM) {
a[i]-=LIM;a[i+1]++;
}
for (;a[l+1];l++);
}
void operator -= (high ot) {
l=max(l,ot.l);
for (int i=1;i<=l;i++)
if ((a[i]-=ot.a[i])<0) {
a[i+1]--;a[i]+=LIM;
}
for (;(l-1) && !a[l];l--);
}
void operator *= (high ot) {
l+=ot.l-1;int i,j;
memset(b,0,sizeof(b));
FOR(i,1,l) FOR(j,1,ot.l)
if ((b[i+j-1]+=a[i]*ot.a[j])>=LIM) {
b[i+j]+=b[i+j-1]/LIM;
b[i+j-1]%=LIM;
}
for (l=100;!b[l];l--);
FOR(i,1,l) a[i]=b[i];
}
bool operator ! () {
return (l==1 && !a[1]);
}
void output() {
int i,j,k;
printf("%d",a[l]);
for (i=l-1;i;i--) printf("%04d",a[i]);
printf("\n");
}
};
void init() {
int i,j,k;
FOR(i,2,MAXM-1) if (!q[i])
for (c[++cl]=i,j=2,k=(MAXM-1)/i;j<=k;j++) q[i*j]=1;
for (j=0,i=1;i<=cl;i++) if (!(m%c[i])) c[++j]=c[i];cl=j;
}
high quick_power(int ti,int nu) {
high ans(1),dot(ti);
for (int i=1;lg[i]<=nu;i++) {
if (nu&lg[i]) ans*=dot;
dot*=dot;
}
return ans;
}
high fin(int u) {
int i,j,k,top=1,nu=1,max;s[top]=1;
high ans;
FOR(i,1,u) nu*=c[i];
if (u>cl) max=cl; else
for (max=u;max<cl && nu<=m;nu=(nu*c[max+1])/c[max-u+1],max++);
for (nu=1;top;) {
if (top>u) {ans+=quick_power(m/nu,n);i=max+1;}
else FOR(i,s[top],max) if (nu*c[i]<=m) {
nu*=c[i];s[top]=i+1;s[++top]=i+1;o[top]=i+1;
break;
}
if (i>max) if (--top) nu/=c[o[top+1]-1];
}
return ans;
}
int main() {
scanf("%d%d",&n,&m);init();
high ans=quick_power(m,n),dot;
FOR(i,1,INF) if (!(dot=fin(i))) break;
else switch (i&1) {
case 0:ans+=dot;break;
case 1:ans-=dot;break;
}
ans.output();
return 1;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator