QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#20517 | #2574. Fancy Arrays | Appleblue17# | WA | 4ms | 60160kb | C++20 | 3.1kb | 2022-02-16 13:16:35 | 2022-05-03 10:21:03 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=1e8+5,M=330,mod=1e9+7,B=4;
long long m,n;
int q,s=1,ans[M];
bool pd[N];
int prime[N];
int cnt;
int mul[M],inv[M];
int C(int m,int n){
if(m<0 || n<0 || m<n) return 0;
return 1ll*mul[m]*inv[n]%mod*inv[m-n]%mod;
}
int ksm(int f,int x){
int tot=1;
while(x){
if(x & 1ll) tot=1ll*tot*f%mod;
f=1ll*f*f%mod;
x>>=1ll;
}
return tot;
}
void init(int lim){
mul[0]=inv[0]=1;
for(int i=1;i<=lim;i++) mul[i]=1ll*mul[i-1]*i%mod;
inv[lim]=ksm(mul[lim],mod-2);
for(int i=lim-1;i>=1;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
pd[1]=1;
for(int i=2;i<=lim;i++){
if(!pd[i]) prime[++cnt]=i;
for(int j=1;j<=cnt && i*prime[j]<=lim;j++){
pd[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int tmp[M],num[M],e[M],id;
struct mtr{
int t[M][M];
}P,R[66][B];
mtr getnew(){
mtr tmp;
for(int i=1;i<=s;i++)
for(int j=1;j<=s;j++)
tmp.t[i][j]=0;
for(int j=1;j<=s;j++) tmp.t[j][j]=1;
return tmp;
}
void qmo(int &x){x += x >> 31 & mod;}
mtr operator *(mtr a,mtr b){
mtr tot;
for(int i=1;i<=s;i++)
for(int j=1;j<=s;j++)
tot.t[i][j]=0;
for(int i=1;i<=s;i++)
for(int k=1;k<=s;k++)
for(int j=1;j<=s;j++)
qmo(tot.t[i][j]+=1ll*a.t[i][k]*b.t[k][j]%mod-mod);
return tot;
}
mtr ksm(mtr a,long long x){
mtr tot=getnew();
while(x){
if(x & 1ll) tot=a*tot;
a=a*a;
x>>=1ll;
}
return tot;
}
int a[M],b[M],val[M];
int A[M],TMP[M];
int main(){
init(M-5);
cin>>m>>q;
long long x=m;
for(int i=1;i<=cnt && prime[i]<=x;i++){
if(x%prime[i]) continue;
int tot=0;
while(x%prime[i]==0) tot++,x/=prime[i];
tmp[tot]++;
}
if(x>1) tmp[1]++;
for(int i=1;i<=80;i++)
if(tmp[i]){
num[++id]=tmp[i];
e[id]=i;
s*=num[id]+1;
}
for(int i=1;i<=s;i++){
for(int j=1;j<=s;j++){
int x=i-1;
for(int t=1;t<=id;t++) a[t]=x%(num[t]+1),x/=(num[t]+1);
int y=j-1;
for(int t=1;t<=id;t++) b[t]=y%(num[t]+1),y/=(num[t]+1);
int sum=1,tot=1;
for(int t=1;t<=id;t++) sum=1ll*sum*C(num[t],b[t])%mod*ksm(e[t],b[t])%mod;
for(int t=1;t<=id;t++){
if(a[t]+b[t]>num[t]){
tot=0;
break;
}
tot=1ll*tot*C(num[t]-a[t],b[t])%mod*ksm(e[t],b[t])%mod;
}
P.t[i][j]=(sum+mod-tot)%mod;
}
}
for(int i=1;i<=s;i++){
int x=i-1;
for(int t=1;t<=id;t++) a[t]=x%(num[t]+1),x/=(num[t]+1);
int tot=1;
for(int t=1;t<=id;t++)
tot=1ll*tot*C(num[t],a[t])%mod*ksm(e[t],a[t])%mod;
val[i]=tot;
}
R[0][1]=P;
for(int i=0;i<=30;i++){
if(i) R[i][1]=R[i-1][B-1]*R[i-1][1];
for(int t=2;t<B;t++) R[i][t]=R[i][t-1]*R[i][1];
}
for(int i=1;i<=q;i++){
// cin>>n; n--;
n=314719601137586866;
for(int i=1;i<=s;i++) A[i]=1;
long long x=n;
for(int t=0;x;t++){
if(x%B){
for(int i=1;i<=s;i++) TMP[i]=0;
for(int i=1;i<=s;i++)
for(int k=1;k<=s;k++)
qmo(TMP[i]+=1ll*R[t][x%B].t[i][k]*A[k]%mod-mod);
for(int i=1;i<=s;i++) A[i]=TMP[i];
}
x/=B;
}
int tot=0;
for(int i=1;i<=s;i++) tot=(tot+1ll*A[i]*val[i]%mod)%mod;
cout<<tot<<endl;
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 4ms
memory: 60160kb
input:
12 3 1 2 3
output:
125436877 125436877 125436877
result:
wrong answer 1st numbers differ - expected: '6', found: '125436877'