hdu1215 : http://acm.hdu.edu.cn/showproblem.php?pid=1215
被这道弱智题卡的内牛满面…第一次做数论就被搞死了……
乍一看以为弱智题,一个循环解决,但是,果断TLE 了…多次剪枝未果,后来才知道这题是在考筛法……
for (i=2;i<=500000;i++)
a[i]=1;//从 2 开始每个数的因子都含有 1
for (i=2;i<=250000;i++)//将 i 作为因数
for (j=i+i;j<=500000;j=j+i)//然后把每个 i 的倍数都加上 i~ 因为对于这些倍数来说, i
a[j]=a[j]+i; //都是他的因数
最后78ms AC ~
hdu1299 : http://acm.hdu.edu.cn/showproblem.php?pid=129 9
这题需要先变个形,具体如下:
关键代码如下:
while(T--)
{
s=1;
scanf("%d",&n);
for (i=2;i<=sqrt((double)n)+2;i++)
{
if (n%i==0)
{
k=0;
while(n%i==0)
{
n=n/i;
k++;
}
s=s*(2*k+1);
}
if (n==1) break;
}
if (n!=1) s=s*3;//这里特别注意,如果 n 本来就是个质数,那么 sqrt(n) 就取不到,所
//以加上
printf("Scenario #%d:/n",p);
p++;
printf("%d/n/n",(s+1)/2);//很显然剩下的数 x 取一个 y 取一个,保证 x>=y ,因此加
//1(可能 x=y) 除以 2
}
hdu 2817 http://acm.hdu.edu.cn/showproblem.php?pid=2817
大指数的求法,原来写的递归+ 记忆化,结果果断 tle 掉,但是用 while 却 15msAC ,效率差距也太大了吧……
while的写法:
sum=1;
while(n)//n为指数
{
if (n%2==1)
{
sum=sum*q;//q底数
}
q=q*q;//底数等于其的平方
n=n/2;//指数除以 2........... 也就是说 (x)^2q=(x^2)^q)
}