QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#776911 | #9619. 乘积,欧拉函数,求和 | ucup-team3548# | WA | 500ms | 6020kb | C++20 | 2.4kb | 2024-11-23 21:34:28 | 2024-11-23 21:34:30 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define MOD(X) ((X)>=Mod?(X)-Mod:(X))
using namespace std;
const ll Mod=998244353;
const int Maxstate=(1<<16);
ll Pow(ll X,ll K)
{
ll Res=1;
ll Times=X;
while(K)
{
if(K&1)Res=Res*Times%Mod;
Times=Times*Times%Mod;
K>>=1;
}
return Res;
}
int N;
ll Prime[17]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
struct num
{
ll Num;
ll Maxf;
int State;
}A[2001];
ll DP[2][(1<<16)+10][2];
ll Invv[17];
bool Cmp(num &B,num &C)
{
return B.Maxf<C.Maxf;
}
ll bf(){
ll ans = 0;
for (int i = 0; i < (1 << N); ++i) {
ll sum = 1;
for (int j = 0; j < N; ++j) {
if (i >> j & 1) {
sum *= A[j + 1].Num;
}
}
for (int j = 1; j <= sum; ++j) {
ans += __gcd(1ll * j, sum) == 1;
}
}
return ans % Mod;
}
int main()
{
for(int i=0;i<16;++i)
Invv[i]=Pow(Prime[i],Mod-2)*(Prime[i]-1)%Mod;
scanf("%d",&N);
for(int i=1;i<=N;++i)
{
scanf("%d",&A[i].Num);
ll Copy=A[i].Num;
for(int j=0;j<16;++j)
{
if(Copy%Prime[j]==0)
A[i].State|=(1<<j);
while(Copy%Prime[j]==0)
Copy/=Prime[j];
}
A[i].Maxf=Copy;
}
sort(A+1,A+N+1,Cmp);
DP[0][0][0]=1;
for(int i=1;i<=N;++i)
{
memset(DP[i&1],0,sizeof(DP[i&1]));
if(i>1&&A[i].Maxf!=A[i-1].Maxf)
{
ll Inv=(A[i-1].Maxf>1?Pow(A[i-1].Maxf,Mod-2):1);
for(int j=0;j<Maxstate;++j)
{
DP[!(i&1)][j][0]=MOD(DP[!(i&1)][j][0]+DP[!(i&1)][j][1]*(A[i-1].Maxf-1)%Mod*Inv%Mod);
DP[!(i&1)][j][1]=0;
}
}
for(int j=0;j<Maxstate;++j)
{
DP[i&1][j][0]=DP[!(i&1)][j][0];
DP[i&1][j][1]=MOD(DP[i&1][j][1]+DP[!(i&1)][j][1]);
DP[i&1][j|A[i].State][1]=(DP[i&1][j|A[i].State][1]+(DP[!(i&1)][j][0]+DP[!(i&1)][j][1])*A[i].Num%Mod)%Mod;
}
}
ll Ans=0;
ll Inv=(A[N].Maxf>1?(Pow(A[N].Maxf,Mod-2)*(A[N].Maxf-1)%Mod):1);
for(int i=0;i<Maxstate;++i)
{
ll Now=(DP[N&1][i][0]+DP[N&1][i][1]*Inv%Mod)%Mod;
for(int j=0;j<16;++j)
if(i&(1<<j))
Now=Now*Invv[j]%Mod;
Ans+=Now;
}
// cout << bf() << " " << Ans % Mod << "\n";
printf("%lld\n",Ans%Mod);
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 6ms
memory: 5836kb
input:
5 1 6 8 6 2
output:
892
result:
ok single line: '892'
Test #2:
score: 0
Accepted
time: 7ms
memory: 5892kb
input:
5 3 8 3 7 8
output:
3157
result:
ok single line: '3157'
Test #3:
score: -100
Wrong Answer
time: 500ms
memory: 6020kb
input:
2000 79 1 1 1 1 1 1 2803 1 1 1 1 1 1 1609 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2137 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 613 1 499 1 211 1 2927 1 1 1327 1 1 1123 1 907 1 2543 1 1 1 311 2683 1 1 1 1 2963 1 1 1 641 761 1 1 1 1 1 1 1 1 1 1 1 1489 2857 1 1 1 1 1 1 1 1 1 1 1 1 1 967 1 821 1 1 1 1 2143 1861...
output:
382782725
result:
wrong answer 1st lines differ - expected: '50965652', found: '382782725'