QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#20683#2574. Fancy Arraysdsakhdkas#WA 3ms20116kbC++2.3kb2022-02-17 15:42:512022-05-03 11:08:17

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-03 11:08:17]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:20116kb
  • [2022-02-17 15:42:51]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
const int Mod=1e9+7;
long long m;
int nu,Q,p[20],q[20],h[20],f[65][20],num,A[65][260][260],M[260][260],tmp[20],c[20][20],a[260][20],C[260][260];
bool fla;
void dfs(int k)
{
	if (k>nu) {
		if (!fla) {fla=true;return;}
		num++;
		for (int i=1;i<=nu;i++)
		  a[num][i]=tmp[i];
		return ;
	}
	for (int i=0;i<=q[k];i++) {
	    tmp[k]=i;
	    dfs(k+1);
	}
	return;
}
void Mul(int n)
{
	for (int i=1;i<=num;i++)
	  for (int j=1;j<=num;j++)
	    for (int k=1;k<=num;k++)
	      A[n][i][j]+=1LL*A[n-1][i][k]*A[n-1][k][j]%Mod,A[n][i][j]%=Mod;
	return ;
}
void Mul_(int n)
{
	for (int i=1;i<=num;i++)
	  for (int j=1;j<=num;j++)
	    C[i][j]=0; 
	for (int i=1;i<=num;i++)
	  for (int j=1;j<=num;j++)
	    for (int k=1;k<=num;k++)
	      C[i][j]+=1LL*A[n][i][k]*M[k][j]%Mod,C[i][j]%=Mod;
	for (int i=1;i<=num;i++)
	  for (int j=1;j<=num;j++)
	    M[i][j]=C[i][j];
	return ;
}
int main()
{
	scanf("%lld%d",&m,&Q);
	int t=0;
	for (int i=2;i<=sqrt(m);i++) 
	  if (m%i==0) {
	  	  t++;
	  	  while (m%i==0) p[t]++,m/=i;
	  }
	if (m>1) p[++t]=1;
	sort(p+1,p+t+1);
	for (int i=1;i<=t;i++)
	  if (p[i]!=p[i-1]) q[++nu]=1,h[nu]=p[i];
	    else q[nu]++;
	for (int i=1;i<=60;i++) {
		f[i][0]=1;
		for (int j=1;j<=t;j++)
		  f[i][j]=1LL*f[i][j-1]*i%Mod;
	}
	for (int i=0;i<=t;i++) {
		c[i][0]=1;
		for (int j=1;j<=i;j++)
		  c[i][j]=(c[i-1][j]+c[i-1][j-1])%Mod;
	}
	fla=false;
	dfs(1);
	cout<<num<<' '<<nu<<endl;
	for (int i=1;i<=num;i++) 
	  for (int j=1;j<=num;j++) {
	  	  A[0][j][i]=1;
	  	  int s=1,ss=1;
	      for (int k=1;k<=nu;k++) {
	      		s=1LL*s*c[q[k]][a[j][k]]%Mod*f[h[k]][a[j][k]]%Mod;
	      		ss=1LL*ss*c[q[k]-a[i][k]][a[j][k]]*f[h[k]][a[j][k]]%Mod;
	      	}
	      A[0][j][i]=(s-ss+Mod)%Mod;
	  }
	for (int i=1;i<=60;i++) Mul(i);
	long long n;
	for (int i1=1;i1<=Q;i1++) {
		scanf("%lld",&n);
		for (int i=1;i<=num;i++)
		  for (int j=1;j<=num;j++)
		    M[i][j]=0;
		for (int i=1;i<=num;i++)
			M[i][i]=1;
		n--;
		for (int i=0;i<=60;i++)
		  if ((n>>i)&1) Mul_(i);
		int ans=0;
		for (int i=1;i<=num;i++) {
			int ss=1;
			for (int j=1;j<=nu;j++)
			  ss=1LL*ss*c[q[j]][a[i][j]]%Mod*f[h[j]][a[i][j]]%Mod;
		    for (int j=1;j<=num;j++) 
		      ans=(ans+1LL*M[j][i]*ss%Mod)%Mod;
		}
		if (n==0) ans++;
		printf("%d\n",ans);
	}
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 20116kb

input:

12 3
1
2
3

output:

3 2
6
21
91

result:

wrong answer 1st numbers differ - expected: '6', found: '3'