帮忙解释一下求互质个数的代码

听自己心跳的声音 2014-08-19 05:32:20
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long LL;

int prime[30];
int top;
int cas;

LL co_prime(LL val)
{
LL ans = 0;

for (int i = 1; i < (1 << top); i++)
{
LL tmp = 1, flag = 0;

for (int j = 0; j < top; j++) if (i&(1 << j))
tmp *= prime[j], flag++;

if (flag & 1)
ans += val / tmp;
else
ans -= val / tmp;
}

return val - ans;
}

void work()
{
LL a, b;
int n;
scanf("%I64d%I64d%d", &a, &b, &n);

top = 0;
for (int i = 2; i*i <= n; i++) if (n%i==0)
{
prime[top++] = i;
while (n%i == 0) n /= i;
}

if (n > 1)
prime[top++] = n;

printf("Case #%d: %I64d\n", ++cas, co_prime(b) - co_prime(a-1));
}

int main()
{
int T;
scanf("%d", &T);
while (T--)
work();
}
里边的这几行代码怎么理解?明白容斥原理我不理解val/tmp代表什么?如果不能整除呢?
if (flag & 1)
ans += val / tmp;
else
ans -= val / tmp;
...全文
159 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
问题是不理解为什么,博客搜了好长时间也找不到。。。。。
赵4老师 2014-08-19
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
  • 打赏
  • 举报
回复
是杭电4135 求1-n与m互质的个数

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧