| ||||||||||
| 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 | |||||||||
WA help!数据太难设计了
#include <stdio.h>
#include <math.h>
struct node {
long l,r,num;
long count;
};
long n,total[10010],ans[10010];
long prime[10010],ccount;
bool ok[10010];
long order[10010],tcount;
long outans;
node tree[10010];
void calc_prime()
{
long i,j;
ccount=0;
for (i=2;i<10010;i++) ok[i]=true;
for (i=2;i<=10010/2;i++) {
if (!ok[i]) continue;
j=i*2;
while (j<10010) {ok[j]=false; j+=i;}
}
for (i=2;i<10010;i++) if (ok[i]) prime[ccount++]=i;
}
void init()
{
long i;
for (i=0;i<n;i++) scanf ("%ld",&order[i]);
}
void build_tree()
{
long i,j;
tcount=0;
for (i=0;i<n;i++) {
if (tcount==0) {
tree[tcount].num=order[i]; tree[tcount].count=1;
tree[tcount].l=-1; tree[tcount].r=-1; tcount++;
continue;
}
j=0; tree[tcount].num=order[i]; tree[tcount].l=tree[tcount].r=-1; tree[tcount].count=1;
while (1) {
if (order[i]>tree[j].num) {
tree[j].count++;
if (tree[j].r==-1) {tree[j].r=tcount; break;}
j=tree[j].r;
}
if (order[i]<=tree[j].num) {
tree[j].count++;
if (tree[j].l==-1) {tree[j].l=tcount; break;}
j=tree[j].l;
}
}
tcount++;
}
}
void calc_total()
{
long queue[10010],closed,opened;
long l,r,i;
for (i=0;i<=n;i++) total[i]=0;
queue[0]=0; closed=0; opened=1;
while (closed<opened) {
i=queue[closed]; l=tree[i].l; r=tree[i].r;
if (l!=-1) {total[tree[l].count]--; queue[opened++]=l;}
if (r!=-1) {total[tree[r].count]--; queue[opened++]=r;}
total[tree[i].count-1]++;
closed++;
}
}
void calc_ans()
{
long i,j,ttotal=0,temp,k,tans;
long twice[50],twcount;
outans=0;
for (i=n-1;i>0;i--) total[i]+=total[i+1];
for (i=0;i<=n;i++) ans[i]=0;
for (i=2;i<=n;i++) {
temp=i;
k=(long)sqrt(double(temp));
for (j=0;j<ccount&&prime[j]<=k;j++)
if (temp%prime[j]==0) {
while (temp%prime[j]==0) {ans[prime[j]]+=total[i]; temp/=prime[j];}
k=(long)sqrt(double(temp));
}
if (temp>1) ans[temp]+=total[i];
}
outans=1;
for (i=0;i<ccount;i++) {
temp=prime[i]; j=ans[temp]; tans=1; twcount=0;
while (j>0) {
twice[twcount++]=j&1; j/=2;
}
for (j=twcount-1;j>-1;j--) {
tans=tans*tans;
if (twice[j]==1) tans*=prime[i];
tans=tans%9901;
}
outans*=tans;
outans=outans%9901;
}
}
void work()
{
build_tree();
calc_total();
calc_ans();
}
void output()
{
printf ("%ld\n",outans);
}
int main()
{
calc_prime();
while (1)
{
scanf ("%ld",&n);
if (n==0) break;
init();
work();
output();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator