从这个半周开始我越来越觉得做的题太少,也可能是方法有问题,周四做的训练赛就感觉能做出来的题就是卡住了,那个D题,其实就是个二分处理,但我就是没能快速做出,一直纠结在使用尺取法做,然而对尺取法不熟悉,就。。。C题,A题貌似也是水题。从现在开始,cf和vj上有的比赛必须都打。不能再倒退了!!!
另外整理下数论2专题的题目吧。
Q题:已知f(0) = 1,0^0 =1,还已知f(n) = (n%10)^f(n/10),让你求f(n)%m. (2 ≤ n , m ≤ 10^9)
这个题其实很快就能想到那个公式: a^b%p=a^(b%phi(p)+phi(p))%p b>=phi(p) 这个公式之前一直没注意b>=phi(p)这个条件,所以这次快速幂要做一些变化,保证这个公式可以用。
ll pow_mod(ll a, ll n, ll m)
{
ll res = 1;
while(n)
{
if(n&1)
{
res = res*a;
if(res>= m)
res=res%m+m;
}
a = a*a;
if(a >= m)
a = a%m+m;//保证a>=m,使公式成立
n >>= 1;
}
return res;
}
ll check(int a,int b,int p) //转载http://blog.csdn.net/qiqijianglu/article/details/7837836,感觉这么写更明晰一些。
{
ll res=1;
for(int i=1;i<=b;i++)
{
res*=a;
if(res>=p) return res;
}
return res;
}
ll dfs(int n,int m)
{
ll phi=get_phi(m);
if(n<10)
return n;
ll x=dfs(n/10,phi);
ll yy=check(n%10,x,m);
if(yy>=m) //只有此时符合公式条件。
{
ll res=powermod(n%10,x+phi,m);
if(res==0)
res+=m;
return res;
}
else
return yy;
}
R题:X题:(因为只有所有因子互素的时候才能用中国剩余定理)都是利用扩展欧几里得算法求二元模线性方程组。
将前两个合并ax1-bx2=r1-r2,用扩展欧几里得算法求出x,进而得到X=a*x+r1,构造r1=X,a1=lcm(a,b),得Y%a1=r1,继续与下面的合并,就这么做出来。很明显, 新构造的方程满足前两个的解。
还没把题目都总结完,剩下的明天更吧。