結果

問題 No.1781 LCM
ユーザー chocoruskchocorusk
提出日時 2021-12-10 22:42:06
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
TLE  
(最新)
AC  
(最初)
実行時間 -
コード長 3,106 bytes
コンパイル時間 3,858 ms
コンパイル使用メモリ 196,556 KB
実行使用メモリ 20,804 KB
最終ジャッジ日時 2023-09-25 21:28:22
合計ジャッジ時間 39,471 ms
ジャッジサーバーID
(参考情報)
judge15 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 11 ms
4,380 KB
testcase_01 AC 12 ms
4,376 KB
testcase_02 AC 13 ms
4,380 KB
testcase_03 AC 13 ms
4,380 KB
testcase_04 AC 13 ms
4,380 KB
testcase_05 AC 13 ms
4,380 KB
testcase_06 AC 13 ms
4,380 KB
testcase_07 AC 11 ms
4,380 KB
testcase_08 AC 11 ms
4,376 KB
testcase_09 AC 12 ms
4,380 KB
testcase_10 AC 11 ms
4,384 KB
testcase_11 AC 11 ms
4,384 KB
testcase_12 AC 10 ms
4,380 KB
testcase_13 AC 12 ms
4,384 KB
testcase_14 AC 11 ms
4,380 KB
testcase_15 AC 11 ms
4,380 KB
testcase_16 AC 11 ms
4,380 KB
testcase_17 AC 11 ms
4,384 KB
testcase_18 AC 11 ms
4,380 KB
testcase_19 AC 10 ms
4,380 KB
testcase_20 AC 11 ms
4,380 KB
testcase_21 TLE -
testcase_22 TLE -
testcase_23 AC 10 ms
4,380 KB
testcase_24 AC 10 ms
4,376 KB
testcase_25 TLE -
testcase_26 TLE -
testcase_27 TLE -
testcase_28 AC 4,493 ms
17,592 KB
testcase_29 AC 1,201 ms
8,956 KB
testcase_30 AC 1,245 ms
9,208 KB
testcase_31 AC 11 ms
4,376 KB
testcase_32 AC 11 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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_popcount
using namespace std;
using namespace atcoder;
typedef long long ll;
typedef pair<int, int> P;
using mint=modint998244353;
const int MAX=1000000;
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;
		}
	}
}
ll p[MAX], n, sq;
int isq;
vector<ll> divs, pc;
inline ll idx(ll x){
	return (x<=sq)?x-1:(ll)divs.size()-n/x;
}
void calc(){
	sieve();
	while((sq+1)*(sq+1)<=n) sq++;
	for(int i=1; i<=sq; i++) divs.push_back(i);
	for(int i=sq; i>=1; i--) if(n/i>sq) divs.push_back(n/i);
	int k=0; isq=-1;
	for(int i=2; i<MAX; i++){
		if(isprime[i]){
            p[k]=i;
            if(i>sq && isq==-1) isq=k;
            k++;
		}
	}
}
void primecount(){
	vector<ll> dp=divs;
	pc.resize(divs.size(), -1);
	int l;
	for(l=0; l<divs.size() && divs[l]<p[0]*p[0]; l++){
		if(divs[l]<=1) pc[l]=0;
		else if(divs[l]==2) pc[l]=1;
		else pc[l]=2;
	}
	for(int i=1; i<=isq; i++){
		int r=lower_bound(divs.begin(), divs.end(), p[i]*p[i])-divs.begin();
		for(int j=(int)divs.size()-1; j>=l; j--){
			int k=idx(divs[j]/p[i-1]);
			if(pc[k]!=-1) dp[j]-=pc[k]-i+2;
			else dp[j]-=dp[k];
		}
		for(int j=l; j<r; j++) pc[j]=dp[j]+i-1;
		l=r;
	}
}
mint ans;
ll len;
mint c[40];
vector<mint> solve(){
	vector<mint> dp(divs.size());
	for(int i=isq-1; i>=0; i--){
		int l=lower_bound(divs.begin(), divs.end(), p[i]*p[i])-divs.begin();
		for(int j=(int)divs.size()-1; j>=l; j--){
			mint a=dp[j];
			if(p[i+1]*p[i+1]>divs[j]){
                //assert(pc[j]>=i+1);
                a=1+mint(pc[j]-i-1)*c[1];
            }
            ll x=divs[j]/p[i];
            int e=1;
            while(x){
                int k=idx(x);
                mint b=dp[k];
                if(x<p[i+1]) b=1;
                else if(p[i+1]*p[i+1]>divs[k]){
                    //assert(pc[k]>=i+1);
                    b=1+mint(pc[k]-i-1)*c[1];
                }
                a+=b*c[e];
                x/=p[i];
                e++;
            }
            dp[j]=a;
		}
	}
    for(int i=0; i<divs.size() && divs[i]<4; i++){
        dp[i]=1;
        for(int j=2; j<=divs[i]; j++){
            dp[i]+=c[1];
        }
    }
    return dp;
}
int main()
{
	cin>>len>>n;
    for(int i=1; i<40; i++){
        c[i]=mint(i+1).pow(len)-mint(i).pow(len);
    }
	calc(); primecount();
    auto dp=solve();
    // for(auto x:divs){
    //     cout<<x<<" "<<pc[idx(x)]<<" "<<dp[idx(x)].val()<<endl;
    // }
    for(auto x:divs){
        ans+=mint(x)*(dp[idx(n/x)]-dp[idx(n/(x+1))]);
    }
    cout<<ans.val()<<endl;
	return 0;
}
0