题意:给定$n=\prod\limits_{i=1}^mp_i^{a_i}$,求$\varphi\left(\cdots\varphi\left(n\right)\cdots\right)$(有$k$个$\varphi$)

因为$\varphi(n)=n\prod\limits_{i=1}^m\dfrac{1-p_i}{p_i}$,所以每次对一个数$n$取$\varphi$,就相当于对它的每个质因数$p$,把$n$乘上$\dfrac{p-1}p$

先筛出$10^6$内的质数,然后对$n$的每一个的质因子分别考虑

记$c_p$为当前$n$的质因数分解式中$p$的指数,$k_p$为还要对$p$这个指数执行多少次$\varphi$,每次比较$c$和$k$,可以一次执行$t=\min(c_p,k_p)$次$\varphi$(一次砍掉$t$个$p$),再把$(p-1)^t$的质因数分解加到对应的$c$即可

这样做会带来一个问题:我们执行$\varphi$时必须要用$n$的质因子$p$,而用到的$p$可能来自最近的几次质因数分解$p-1$,而这几次分解并未完全分解,所以我们对于某些执行$\varphi$多次的$p$要暂缓执行(等待之前的$p-1$被分解完),记$skip_p$表示对于$p$要跳过多少次执行$\varphi$,每次如果可以执行,那么就用$t-1$更新$skip_p$(执行完这次,还要等待$t-1$波分解其他质因子就可以继续了),否则按$skip_p$跳过几次,这样可以保证每次执行$\varphi$都优先使用原来的$p$,最后再把$p-1$分解留到以后使用

数据范围很吓人,可是这样是挺快的2333(因为如果要执行$\varphi$一次就是$\min(c_p,k_p)$,所以这两个数都减小得很快)

2018.3.28补充一些东西

$\varphi\left(\prod\limits_{i=1}^kp_i^{a_i}\right)=\prod\limits_{i=1}^k\varphi\left(p_i^{a_i}\right)=\prod\limits_{i=1}^kp_i^{a_i-1}\left(p_i-1\right)$

第一次取$\varphi$,我们可以对每个质因数分开考虑,之后的取$\varphi$操作就要小心了,如果我们对原来的$p_i$执行$\varphi$,由此产生的$p_i-1$分解之后会加到更小的$p_i$上

所以,①我们要从小到大枚举$p_i$做$\varphi$操作(因为$p_i-1$分解成更小的质数)②一次性对$p_i$做完$t$次$\varphi$之后,接下来如果当前没有$p_i$这个因子,我们要跳过这些操作(总共跳过$t-1$次)而不是直接把$k_{p_i}-1$(因为接下来同一阶段的其他的$p_i-1$分解之后有可能落到这里,我们不能忽略掉这些“新来的”$p_i$)

#include<stdio.h>
typedef long long ll;
const int T=1000000;
int p[1000010],f[1000010];
ll c[1000010],k[1000010],skip[1000010];
ll min(ll a,ll b){return a<b?a:b;}
int main(){
	int m,M,i,j,x;
	ll t;
	bool flag;
	for(i=2;i<=T;i++){
		if(f[i]==0){
			M++;
			p[M]=i;
			f[i]=i;
		}
		for(j=1;p[j]<=f[i]&&p[j]*i<=T&&j<=T;j++)f[p[j]*i]=p[j];
	}
	scanf("%d",&m);
	while(m--){
		scanf("%d",&x);
		scanf("%I64d",c+x);
	}
	scanf("%I64d",&t);
	for(i=1;i<=T;i++)k[p[i]]=t;
	do{
		flag=0;
		for(i=1;i<=T;i++){
			x=p[i];
			if(c[x]){
				if(k[x]==0)continue;
				t=min(c[x],k[x]);
				c[x]-=t;
				k[x]-=t;
				skip[x]+=t-1;
				flag=1;
				x--;
				while(x>1){
					c[f[x]]+=t;
					x/=f[x];
				}
			}else if(skip[x])
				skip[x]--;
			else if(k[x])
				k[x]--;
		}
	}while(flag);
	x=0;
	for(i=1;i<=T;i++){
		if(c[p[i]])x++;
	}
	printf("%d\n",x);
	for(i=1;i<=T;i++){
		if(c[p[i]])printf("%d %I64d\n",p[i],c[p[i]]);
	}
}

[CF396E]On Iteration of One Well-Known Function的更多相关文章

  1. Openfire Strophe开发中文乱码问题

    网站上有很多Openfire Web方案,之前想用Smack 但是jar包支持客户端版本的,还有JDK版本问题  一直没调试成功  估计成功的方法只能拜读源码进行修改了. SparkWeb 官网代码很 ...

  2. python3.4 build in functions from 官方文档 翻译中

    2. Built-in Functions https://docs.python.org/3.4/library/functions.html?highlight=file The Python i ...

  3. python3 入门 (三) 函数与lambda表达式、闭包

    函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ...

  4. zw版_Halcon图像库delphi接口文件

    zw版_Halcon图像库delphi接口文件 Halcon图像库delphi接口文件,根据安装时用户设置的文件目录不同,会有所差异,笔者一般安装在delphi的import目录下.     参见:& ...

  5. A Neural Network in 11 lines of Python

    A Neural Network in 11 lines of Python A bare bones neural network implementation to describe the in ...

  6. Python2.7笔记——常用技术点汇总

    目录 · 概况 · 安装 · 基础 · 基础语法 · 数据类型 · 变量 · 常量 · 字符编码 · 字符串格式化 · list · tuple · dict · set · if语句 · for语句 ...

  7. 内置函数 -- filter 和 map

    参考地址:http://www.cnblogs.com/sesshoumaru/p/6000788.html 英文文档: filter(function, iterable) Construct an ...

  8. CSS3动画以及animation事件

    1.CSS3动画以及animation事件的定义 animation :name duration timing-function delay iteration-count direction an ...

  9. Python内置函数(34)——filter

    英文文档: filter(function, iterable) Construct an iterator from those elements of iterable for which fun ...

随机推荐

  1. HZOI String STL的正确用法

                                                                      String          3s 512 MB描述硬盘中里面有n ...

  2. bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 分块

    这个题体现了分块不只是最大值最小值众数次数,而是一种清真的思想. 我们把整个序列分块,在每个块里处理每个位置跳出这个块的次数和跳出的位置,那么每次修改n0.5,每次查询也是,那么O(m* n0.5)的 ...

  3. 文件格式转换神器-pandoc

    By francis_hao    Mar 11,2017 介绍 如果你需要在各种类型的文件中穿梭,那么你需要这把瑞士军刀-pandoc 它可以将各种常见的不常见的文件类型转换成另一种,我感兴趣的是在 ...

  4. 如何使用Navicat备份数据库脚本

    Navicat是一个实用的工具,可以用来备份数据库(Oracle.MySQL.SQLServer)脚本. 备份步骤如下: 1.打开已建立的数据库连接,鼠标右键点击,选择[转储SQL文件]->[结 ...

  5. [POJ2777] Count Color

    \[Count Color\] Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 50865 Accepted: 15346 Des ...

  6. 使用MAT分析内存泄露

    使用MAT分析内存泄露 对于大型服务端应用程序来说,有些内存泄露问题很难在测试阶段发现,此时就需要分析JVM Heap Dump文件来找出问题.随着单机内存越来越大,应用heap也开得越来越大,动辄十 ...

  7. nginx压力测试和优化配置

    115 yum -y install gcc automake autoconf libtool make 116 yum install ctags 117 mkdir -m 644 -p /usr ...

  8. background-color和background-image问题

    今天撸码的时候发现需要background-color和background-image 一起用,才开始考虑两个可不可以一起用  查阅多方资料才知道可以写成background:color url() ...

  9. TCP(二)

    TCP半连接和全连接问题 TCP握手过程详解 如上图所示,关键部分:syns queue(半连接队列)和accept queue(全连接队列) 正常情况下的处理过程如下: 1)当server端收到cl ...

  10. AtCoder Regular Contest 082 E

    Problem Statement You are given N points (xi,yi) located on a two-dimensional plane. Consider a subs ...