SDOI2008 沙拉公主的困惑

【题解】【欧拉函数】

问题描述

大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量。现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可。R是一个质数。

输入格式

第一行为两个整数T,R。R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行一对整数N,M,见题目描述 m<=n

输出格式

共T行,对于每一对N,M,输出1至N!中与M!互质的数的数量对R取模后的值

这道题翻译成大白话就是,给出正整数M和N(M<=N),问1到N!中有多少个数和M!互质。对质数R取模后再输出

暴力显然不可取。

既然M<=N,那么可以分成两部分讨论:[1,M!]和[M!+1,N!]

显然,[1,M!]范围内,与M!互质的数有phi(M!)个。

对于[M!+1,N!]:

我们已知,M<=N,所以N!可以整除M!,所以上述范围又可以表示成:[M!+1,k*M!]。

也就是说,[M!+1,N!]包含了k-1个M!。

已知,若a与b互质,即gcd(a,b)==1,那么a+k*b同样与b互质,即gcd(a+k*b,b)==1。

比如3和8互质,那么11和8互质,19和8互质…,3+k*8和8互质。

所以,[1,M!]里有phi(M!)个数与M!互质,那么[1+M!,M!+M!]即[M!+1,2*M!]里就有phi(M!)个数与M!互质。所以,[M!+1,k*M!]里有(k-1)*phi(M!)个数与M!互质,[1,k*M!]里有k*phi(M!)个数与M!互质。k=N!/M!。

结论:[1,N!]里有(N!/M!)*phi(M!)个数与M!互质。

如何优雅地求解(N!/M!)*phi(M!)

N!可以直接暴力求。

phi(M!)用欧拉函数的通式打开,M!可以约掉,质因数就是[1,M]的质数,然后求一下每个质数对模数R的逆元(可用快速幂,R是质数,一定有逆元),最后相乘……反正在草稿纸上胡乱画一通就算出来了。

但是,一定要预处理!否则会不停地TLE…

总结

1.如果数据范围在int内,则用long long防止做乘法时溢出,乘法可用普通乘法 ;如果在long long内,乘法要用慢速快速乘法。

2.存在倍数关系的数之间可以分步讨论,最后找出通式。

3.如果题目卡时/卡空间/卡时卡空间,果断放弃在线,要预处理。

4.对于两个正整数x,y,如果y是x的倍数,那么[1,y]中与x互质的数的个数为(y/x)*phi(x)。

你可能感兴趣的:(题解,数论)