您的位置:首页 > 其它

BZOJ4173

2018-03-28 21:26 155 查看
https://www.lydsy.com/JudgeOnline/problem.php?id=4173
学了半天数论突然发现自己还没入门
我日
这题
太不好想了
不过可以打表找规律
然而我却懒
没打表
想了二十分钟没思路
看了题解
题解真的牛逼
卧槽 https://blog.csdn.net/zhhx2001/article/details/52300924 https://blog.csdn.net/popoqqq/article/details/46820313
牛逼吧
最牛逼的是就两行代码
可是你就是写不出来
让我们记住这个式子



AC代码:#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int gcd(int a,int b){return a%b==0?b:gcd(b,a%b);}

ll quickmod(ll a,ll b,ll m){ll ans=1;while(b)
{if(b&1)ans=(ans*a)%m;b>>=1;a=a*a%m;}return ans;}

ll inv(ll a,ll p){return quickmod(a, p-2, p);}

ll exgcd(ll a,ll b,ll &x,ll &y){if (b==0){x=1,y=0;
return a;}ll q=exgcd(b,a%b,y,x);y-=a/b*x;return q;}

void ChinaRT(ll r,ll *m,ll *a,ll &M,ll &ans){M=1,ans=0;
ll x,y;for(ll i=1;i<=r;++i)M*=m[i];for(ll i=1;i<=r;++i)
{exgcd(M/m[i],m[i],x,y);ans=(ans+M/m[i]*x*a[i])%M;}
if(ans<0)ans+=M;}

ll EXCRT(int n,ll *m,ll *r){ll M=m[1],R=r[1],x,y,d;
for(int i=2;i<=n;i++){d=exgcd(M,m[i],x,y);if((r[i]-R)%d)
return -1;x=(r[i]-R)/d*x%(m[i]/d);
R+=x*M;M=M/d*m[i];R%=M;}return R>0?R:R+M;}

ll divide(ll n,ll *p,ll *c){ll m=0;for(int i=2;i*i<=n;++i){
if(n%i==0){p[++m]=i,c[m]=0;while(n%i==0){n/=i;c[m]++;}}}
if(n>1)p[++m]=n,c[m]=1;return m;}

ll phi(ll x){ll ans=x;for(ll i=2;i*i<=x;i++){if(x%i==0){
ans=ans/i*(i-1);while(x%i==0)x/=i;}}if(x>1)ans=ans/x*(x-1);
return ans;}

int main(){
ll n,m;
cin>>n>>m;
ll M=998244353;
printf("%lld",phi(n)%M*(phi(m)%M)%M*(n%M)%M*(m%M)%M);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: