数论第一天....

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)

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值