結果
問題 | No.1760 Setwise Coprime |
ユーザー |
![]() |
提出日時 | 2021-11-20 13:46:31 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,972 ms / 2,000 ms |
コード長 | 2,719 bytes |
コンパイル時間 | 12,579 ms |
コンパイル使用メモリ | 201,020 KB |
実行使用メモリ | 29,612 KB |
最終ジャッジ日時 | 2025-03-23 08:24:11 |
合計ジャッジ時間 | 37,397 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 36 |
ソースコード
#include <cstdio>#include <cstring>#include <iostream>#include <string>#include <cmath>#include <bitset>#include <vector>#include <map>#include <set>#include <queue>#include <deque>#include <algorithm>#include <complex>#include <unordered_map>#include <unordered_set>#include <random>#include <cassert>#include <fstream>#include <utility>#include <functional>#include <time.h>#include <stack>#include <array>#include <list>#include <atcoder/all>#define popcount __builtin_popcountusing namespace std;using namespace atcoder;typedef long long ll;typedef pair<int, int> P;using mint=modint998244353;const int MAX=200020;bitset<MAX> isprime;void sieve(){for(int i=3; i<MAX; i++, i++) isprime[i]=1;isprime[2]=1;for(int i=3; i<MAX; i++){if(isprime[i]){for(int j=(i<<1); j<MAX; j+=i) isprime[j]=0;}}}vector<int> vd[200020];int m[200020];int main(){int n;cin>>n;for(int d=1; d<=n; d++){for(int i=d; i<=n; i+=d) vd[i].push_back(d);}sieve();fill(m+1, m+n+1, 1);for(int i=2; i<=n; i++){if(!isprime[i])continue;for(int j=i; j<=n; j+=i){if(j%((ll)i*i)==0){m[j]=0;}m[j]=-m[j];}}mint x[200020];for(int i=1; i<=n; i++){x[i]=mint(m[i])*(mint(2).pow(n/i));}mint ans=0;mint q[200020];for(int i=1; i<=n; i++){q[i]=m[i]*(mint(2).pow(n/i)-1);ans+=q[i];}ans=ans*ans;mint y[200020], z[200020], w[200020];for(int i=1; i<=n; i++){for(auto d1:vd[i]){for(auto d2:vd[i]){if(lcm(d1, d2)<i)continue;y[i]+=x[d1]*x[d2];z[i]+=x[d1]*m[d2];//w[i]+=m[d1]*m[d2];}}}for(int i=1; i<=n; i++){ans+=y[i]/(mint(4).pow(n/i));ans-=2*z[i]/(mint(2).pow(n/i));ans+=2*z[i];ans-=y[i];//ans+=w[i];ans+=2*(mint(2).pow(n/i)-1)*(y[i]/(mint(4).pow(n/i)));ans-=2*(mint(2).pow(n/i)-1)*z[i]/(mint(2).pow(n/i));ans+=(mint(3).pow(n/i)-2*mint(2).pow(n/i)+1)*y[i]/(mint(4).pow(n/i));}cout<<ans.val()<<endl;// mint ans1=0;// for(int i=1; i<=n; i++){// for(int j=1; j<=n; j++){// int l=lcm(i,j);// mint a=mint(2).pow(n/i-n/l)-1;// mint b=mint(2).pow(n/j-n/l)-1;// ans1+=m[i]*m[j]*a*b;// ans1+=m[i]*m[j]*2*(mint(2).pow(n/l)-1)*(a+1)*b;// ans1+=m[i]*m[j]*(mint(3).pow(n/l)-2*mint(2).pow(n/l)+1)*(a+1)*(b+1);// }// }// cout<<ans1.val()<<endl;return 0;}