Groundhog Chasing (数论&质因数)
思路:枚举质因子贡献。
然后第一维暴力,第二维用公式求和。
第二维分三种情况:
设当前因子为 , 的该因子个数为 , 的该因子个数为 。
1.当 时。
显然都为:从 贡献都为
2.当 时。
显然从 贡献为: ,即:
3.当 时 令
从 贡献为:
从 贡献为:
时间复杂度:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
ll f(int l,int r){ return 1LL*(l+r)*(r-l+1)>>1;}
ll ksm(ll a,ll n){ll ans=1;while(n){if(n&1) ans=ans*a%mod;a=a*a%mod;n>>=1;}return ans;
}
int a,b,c,d,x,y;
vector<int>dir;
int main(){scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&x,&y);int g=__gcd(x,y);for(int i=2;i*i<=g;i++){if(g%i==0){dir.pb(i);while(g%i==0) g/=i;}} if(g>1) dir.pb(g);ll ans=1;for(int s:dir){int x1=x,y1=y,c1=0,c2=0;while(x1%s==0) x1/=s,c1++;while(y1%s==0) y1/=s,c2++;ll sum=0;for(int i=a;i<=b;i++){if(i*c1<=c*c2) sum+=1LL*(d-c+1)*i*c1;else if(i*c1>=d*c2) sum+=f(c,d)*c2;else sum+=f(c,i*c1/c2)*c2+1LL*(d-i*c1/c2)*i*c1;sum%=(mod-1);}ans=ans*ksm(s,sum)%mod;//printf("%lld\n",ans);}printf("%lld\n",ans);return 0;
}