rt,经苯人手玩检查核心代码(线性筛)原理上应该是没什么问题,我感觉是取模有地方出事了,但是又感觉该取模的地方都取到了qwq
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
vector<int> prime;
bool vis[21451419];
int d[21451419],num[21451419],g[21451419],n;
void init(){//ÏßÐÔÉ¸ËØÊý
for(int i=2;i<=1e5;++i){
if(!vis[i]){
prime.push_back(i);
}
for(int j=0;j<prime.size();++j){
int t=prime[j];
if(t*i>1e5) break;
vis[i*t]=1;
if(!(i%t)) break;
}
}
}
signed main(){
init();
int a,b,c;
cin>>n>>a>>b>>c;
cin>>g[n];
for(int i=n-1;i>=1;--i) g[i]=((a%mod*g[i+1]%mod*g[i+1]%mod)%mod+b*g[i+1]%mod+c)%mod;
d[1]=1;
for(int i=2;i<=n;++i){//ÏßÐÔɸԼÊý¸öÊý
if(!vis[i]){
num[i]=1;d[i]=2;
}
else{
int p;
for(int j=0;j<prime.size();++j)
if(!(i%prime[j])){
p=prime[j];break;
}
int q=i/p;
if(q%p){
num[i]=1;d[i]=d[q]*2;
}
else{
num[i]=num[q]+1;d[i]=d[q]*(num[i]+1)/num[i];
}
num[i]%=mod;d[i]%=mod;
}
}
for(int i=1;i<=n;++i){
d[i]+=d[i-1];d[i]%=mod;//ͳ¼ÆÇ°×ººÍ
}
int ans=0;
for(int i=1;i<=n;++i){
ans+=(((n-i+1)%mod)*((d[i-1]+n)%mod)%mod)*g[i]%mod;//ͳ¼Æ´ð°¸
ans%=mod;
}
cout<<ans;
return 0;
}