题目链接:https://ac.nowcoder.com/acm/contest/46811/K
需要的知识:
质因子公式。
介绍:
如果一个数可以化为\(i^x*j^y*k^z\),
则这个数的因子个数为:\((x+1)*(y+1)*(z+1)\),其中\(i,j,k\)为质数,这个定理易证。
思路:
可以将所有的数分为一段一段的,第一段数为大于等于1的数,第二段为大于等于2的数,以此类推。
第一段每增加一个数,就相当于一个因子由1变成2,相当于为一个公比为2的等比数列。
第二段相当于由2变成3,相当于才一个公比为3/2的等比数列。
以此类推:第n段相当于一个公比为(n+1)/n的等比数列。
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
long long ci[200010];
long long qmod(long long x,long long y){
long long ans = 1;
while(y){
if (y&1) ans = ans*x%mod;
y = y>>1;
x = x*x%mod;
}
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
for (int i=1;i<=n;i++){
int x;
cin>>x;
ci[x]++;
}
for (int i=n;i>=1;i--) ci[i] += ci[i+1];
long long a1 = 1;
long long ans = 0;
for (int i=1;i<=200000;i++){
long long v = ci[i];
long long q = (i+1)*qmod(i,mod-2)%mod;
if (v) a1 = a1*q%mod;
ans = (ans+a1*(1-qmod(q,v))%mod*qmod(1-q,mod-2)%mod)%mod;
a1 = a1*qmod(q,max(0ll,v-1))%mod;
}
cout<<ans;
}
标签:ci,int,训练营,2023,long,牛客,公比,ans,mod
From: https://www.cnblogs.com/xjwrr/p/17268392.html