正题

题目链接:https://www.luogu.com.cn/problem/P2350


题目大意

给出\(N\)质因数分解之后的结果,求每次\(N=\varphi(N)\),多少次后\(N=1\)。

\(N=\prod_{i=1}^mp_i^{q_i},1\leq m\leq 2000,1\leq p_i\leq 10^5,1\leq q_i\leq 10^9\)


解题思路

我是傻逼((((

首先\(\varphi(\prod_{i=1}^mp_i^{q_i})=\prod_{i=1}^m(p_i-1)p_i^{q_i-1}\)

开始想太多了,以为传递的延迟影响很大,后来发现设因为\(p_i-1\)一定是偶数,所以把\(p_i-1\)分解后一定有\(2\)这个质因子,所以只有在\(N\)没有\(2\)这个质因子的情况下传递的延迟会造成一次的影响,否则都没有影响,因为\(2\)还没有抵消延迟就已经结束了。

所以我们只需要考虑每个质数能传递出多少个\(2\),这个用线性筛可以解决因为最后更新一个质数的一定是新增的一个质因子。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=1e5+10;
int T,n,cnt,pri[N],f[M],v[M];
void Prime(){
f[1]=1;
for(int i=2;i<M;i++){
if(!v[i])pri[++cnt]=i,f[i]=f[i-1];
for(int j=1;j<=cnt&&i*pri[j]<M;j++){
v[i*pri[j]]=1;
f[i*pri[j]]=f[i]+f[pri[j]];
if(i%pri[j]==0)break;
}
}
return;
}
int main()
{
Prime();
scanf("%d",&T);
while(T--){
scanf("%d",&n);
if(!n)puts("0");
long long ans=1;
for(int i=1;i<=n;i++){
int x,w;
scanf("%d%d",&x,&w);
if(x==2)ans--;
ans+=1ll*f[x]*w;
}
printf("%lld\n",ans);
}
return 0;
}

最新文章

  1. 【译】Spring 4 基于TaskScheduler实现定时任务(注解)
  2. mysql 一些命令
  3. PXC(percona xtradb cluster)新加节点避免SST的方法
  4. 委托的例子,from C# advanced program
  5. Stanford机器学习笔记-4. 神经网络Neural Networks (part one)
  6. adb操作命令详解及大全
  7. iPhone6分辨率与适配
  8. EF学习笔记——通用增删改查方案
  9. windows 和 linux ssh互连
  10. 在C,C++,JAVA中int,char,各占几个字节
  11. jQuery两句话实现HTML转义与反转义
  12. share js 分享代码
  13. 使用MapReduce将HDFS数据导入到HBase(二)
  14. 64位Win7安装+32位Oracle + PL/SQL 解决方法
  15. jquery clone方法
  16. HDU 2121 Ice_cream’s world II 最小树形图 模板
  17. SOA 下实现分布式 调用 cxf+ webService +动态调用
  18. Linux笔记③(ftp、nfs、ssh服务器搭建)
  19. Delphi中 StrToIntDef函数的用法
  20. Java Web 禁用Cookie对Session的影响

热门文章

  1. 基于css的一些动画
  2. springboot整合多数据源解决分布式事务
  3. WPF 获取主线程
  4. Java知识图谱(附:阿里Java学习计划)
  5. Linux操作系统基本应用(完结)
  6. java 后台解密小程序前端传过来的信息,解密手机号
  7. JavaScript 特殊字符
  8. Spring 事务回滚机制详解
  9. int索引转Excel列名(JavaScript版)
  10. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo