5340. 【NOIP2017模拟9.2A组】春思

    科技2023-09-28  78

    题面

    题目描述

    输入

    两个非负整数A,B

    输出

    仅一个正整数,表示答案

    样例输入

    2 3

    样例输出

    15

    数据范围

    提示

    题解

    这道题有N个结论

    第一:A可分解为 P 1 b 1 P 2 b 2 . . . P n b n P1^{b1}P2^{b2}...Pn^{bn} P1b1P2b2...Pnbn(分解质因数) 第二:首先,第一点是正确的,其次, A B A^B AB可表示为 P 1 b 1 ∗ B P 2 b 2 ∗ B . . . P n b n ∗ B P1^{b1*B}P2^{b2*B}...Pn^{bn*B} P1b1BP2b2B...PnbnB。 第三:首先,第二点是正确的,其次,若x的约数和为X,y的约数和为Y,则xy的倍数和为XY 第四:首先,第三点是正确的,其次,若pr为一个质数,易得 p r c pr^c prc的约数和= 1 + p r 1 + p r 2 + . . . + p r c 1+pr^1+pr^2+...+pr^c 1+pr1+pr2+...+prc。 第五:这次没有首先了,第四点中的式子是一个等比数列,等比数列的求和公式为: S n = a 1 ( q n − 1 ) q − 1 ( q ≠ 1 ) S_n=\frac{a_1(q^n-1)}{q-1}(q\neq 1) Sn=q1a1(qn1)(q=1) 其中a1为首项,q为等比数列公比,Sn为等比数列前n项和。

    所以就可以很轻松的分解质因数+等比数列求和+乘法逆元/递归求解了!!!

    代码

    #include<bits/stdc++.h> using namespace std; int i,j,k,l,o,num,ny[9905]; long long a[55][2],p; long long n,m; void fjzys(long long x) { long long y=1; num=0; while (y<sqrt(x)) { y++; if (x%y==0) { num++; a[num][0]=y; while (x%y==0) { a[num][1]+=p; x/=y; } } } if (x==1) return; if (a[num][0]==x) { a[num][1]=a[num][1]+p; } else { num++; a[num][0]=x%9901; a[num][1]=p; } } long long ksm(long long w,long long t) { long long v=1; w%=9901; while (t!=0) { if (t%2==1) { v=(v*w)%9901; } t>>=1; w=(w*w)%9901; } return v; } int main() { freopen("spring.in","r",stdin); freopen("spring.out","w",stdout); scanf("%lld %lld",&n,&m); p=m; fjzys(n); ny[0]=0; for (i=1;i<=9901;i++) { ny[i]=ksm(i,9899); } long long ans=1; for (i=1;i<=num;i++) { ans=ans*((ksm(a[i][0],a[i][1]+1)+9900)%9901)%9901*ny[(a[i][0]+9900)%9901]%9901; } printf("%lld",ans); }
    Processed: 0.292, SQL: 8