数论|BZOJ 3560 DZY Loves Math V 数论

【数论|BZOJ 3560 DZY Loves Math V 数论】题目大意:给定a1,a2,...,an,求


由于φ是积性函数,我们可以将i1i2...in分解质因数,对于每个质因数分开讨论,求积即可
将每个a分解质因数,假设分解后某个质数p在每个ai中的次数分别是bi,那么p对答案的贡献就是
数论|BZOJ 3560 DZY Loves Math V 数论
文章图片


于是对p^j维护一个前缀和,直接计算即可

#include #include #include #include #define MOD 1000000007 using namespace std; struct abcd{ int p,a; bool operator < (const abcd &x) const { if(p!=x.p) return p>=1; } return re; } void Calculate(int l,int r) { static long long sum[30]; long long p=prime_factors[l].p; long long re=1; int i; sum[0]=1; for(i=1; i<=prime_factors[r].a; i++) sum[i]=sum[i-1]*p%MOD; for(i=1; i<=prime_factors[r].a; i++) (sum[i]+=sum[i-1])%=MOD; for(i=l; i<=r; i++) (re*=sum[prime_factors[i].a])%=MOD; re--; (re*=Quick_Power(p,MOD-2))%=MOD; (re*=p-1,++re)%=MOD; (ans*=re)%=MOD; } int main() { int i,x; cin>>n; for(i=1; i<=n; i++) { scanf("%d",&x); Decomposition(x); } sort(prime_factors+1,prime_factors+tot+1); for(i=1; i<=tot; i++) { static int last; if(i==tot||prime_factors[i].p!=prime_factors[i+1].p) Calculate(last+1,i),last=i; } cout<<(ans%MOD+MOD)%MOD<



    推荐阅读