首先是数学推理,这个,。。。。实在是有所欠缺。。。。。。
草,文字风格能不能不像小岛。。。
还是用尼玛那种感觉吧,愤世嫉俗!!!!!!!
(x-k)(y-k)=k*k!!!!!!!!!!!!!!!!!
然后你就可以推了吧!!!!!!!!!!!!!!!
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<cctype> 5 #include<iostream> 6 using namespace std; 7 int f[10000]; 8 int n; 9 int vis[400]; 10 int prime[400]; 11 inline int readint() 12 { 13 char c=getchar(); 14 while(!isdigit(c)) c=getchar(); 15 16 int x=0; 17 while(isdigit(c)) 18 { 19 x=x*10+c-'0'; 20 c=getchar(); 21 } 22 return x; 23 } 24 int buf[10]; 25 inline void writeint(int i) 26 { 27 int p=0; 28 if(i==0) p++; 29 else while(i) 30 { 31 buf[p++]=i%10; 32 i/=10; 33 } 34 for(int j=p-1;j>=0;j--) putchar('0'+buf[j]); 35 } 36 int Scan() 37 { 38 int res = 0, ch, flag = 0; 39 40 if((ch = getchar()) == '-') //判断正负 41 flag = 1; 42 43 else if(ch >= '0' && ch <= '9') //得到完整的数 44 res = ch - '0'; 45 while((ch = getchar()) >= '0' && ch <= '9' ) 46 res = res * 10 + ch - '0'; 47 48 return flag ? -res : res; 49 } 50 int main() 51 { 52 int tt=0; 53 for(int i=2;i<300;i++) 54 if(!vis[i]) 55 { 56 prime[tt++]=i; 57 for(int j=i*i;j<300;j+=i) 58 vis[j]=1; 59 } 60 //for(int i=0;i<tt-8;i++) printf("%d ",prime[i]); 61 //n=readint();printf("%d ",n); 62 while(n=Scan()) 63 { 64 memset(f,0,sizeof(f)); 65 int cnt=0,sum=1; 66 for(int i=0;prime[i]*prime[i]<=n;i++)//一开始为什么/prime[i]就错了 67 { 68 int t=0; 69 while(n%prime[i]==0) 70 { 71 t+=2; 72 n/=prime[i]; 73 } 74 sum*=t+1; 75 } 76 if(n!=1) sum*=3; 77 writeint(sum/2+1); 78 putchar(' '); 79 } 80 return 0; 81 }
!!!!!!!!!!!然后一个memset 10000*数据组数的感觉!!!!!!!!!
!!!!!!!!!!尼玛坑我呢!!!!!!!!
不过也好,顺便复习了一点数论的知识加一点生成子集,
附输入加速!!!!!!!!!!!!!!
顺便理解了位向量法的原理!