网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月03日漏签0天
c语言吧 关注:801,697贴子:4,374,682
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 25回复贴,共1页
<<返回c语言吧
>0< 加载中...

acm 题 算法超时 求思路

  • 只看楼主
  • 收藏

  • 回复
  • 345662584
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

月老最近遇到了一个很棘手的问题,就是“剩男”“剩女”急速增长,而自己这边又人手不足导致天天都得加班。现在需要你来帮助月老解决这个问题,牵红绳的规则很简单:每个男生都一个编号n(1<=n<=500000),编号n的因数之和就是要牵线的女生的编号。如20的因子是:1,2,4,5,10;
输入
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000). 输出
对于每组测试数据,请输出一个代表输入编号N男生的另一半的编号.
样例输入
3 2 10 12
样例输出
1 8 16


  • 白日梦终剧
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不明题意,因式之和是什么?


2026-01-03 09:22:45
广告
不感兴趣
开通SVIP免广告
  • 唱战倒残忍3i
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
10 -- 1 2 5 这简单,首先用数组储存输入的n的因子,最后把数组相加就行了.


  • 345662584
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
#include<math.h>
int main(){
int n,m,t,i;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
t=1;
for(i=2;i<=sqrt(m);i++)
if(m%i==0&&m/i!=i)
t=t+i+m/i;
else if(m%i==0) t+=i;
printf("%d\n",t);
}
}
我写的代码


  • 唱战倒残忍3i
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int n,m,i;
double t;
scanf("%d",&n);
while(n--)
{
t = 0;
scanf("%d",&m);
for(i =1; i <=m/2; ++i)
if(m % i==0)
t+=i;
printf("%.f\n",t);
}
return 0;
}
试试我这个


  • zczqwd
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先将所有1-500000的数字对应的数值求出来输出到文件中(即先训练一个结果文件)。我们所做的只需读这个文件中的数据到内存,再根据输入数据运用指针索引,相当于制表。不过这应该算是一种作弊吧,毕竟制表活动由外界完成,没计入算法时间。


  • 唱战倒残忍3i
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

果然还是要优化算法.


  • crazy_bun
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没人想过位运算么。


2026-01-03 09:16:45
广告
不感兴趣
开通SVIP免广告
  • 不结尾
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
裸做肯定超时,试试预处理。


  • zxl0714
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
硬做就行,素数表要是懒不筛都行,只需要知道约数求和公式,这个请百度并且加强一下积性函数的理解。
#include <cstdio>
int main( )
{
int t, n, p, i, ans, s;
scanf("%d", &t);
while ( t-- )
{
scanf("%d", &n);
p = n;
ans = 1;
i = 2;
while ( i * i <= p )
{
if ( p % i == 0 )
{
s = i;
while ( p % i == 0 )
{
p /= i;
s *= i;
}
ans *= ( s - 1 ) / ( i - 1 );
}
i++;
}
if ( p != 1 ) ans *= p + 1;
printf("%d\n", ans - n);
}
return 0;
}


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 25回复贴,共1页
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示