結果
問題 | No.1383 Numbers of Product |
ユーザー | 沙耶花 |
提出日時 | 2021-02-07 21:08:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,199 ms / 2,000 ms |
コード長 | 1,216 bytes |
コンパイル時間 | 3,279 ms |
コンパイル使用メモリ | 198,732 KB |
最終ジャッジ日時 | 2025-01-18 14:13:24 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 51 |
ソースコード
#include <stdio.h> #include <bits/stdc++.h> using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf 1000000001 int main(){ long long N,K,M; cin>>N>>K>>M; map<long long,long long> mp; for(long long i=1;i<=1000000;i++){ long long temp = N; long long x = 1LL; for(int j=0;true;j++){ temp /= i + K * j; if(temp<=0)break; x *= i + K * j; if(j>=2)mp[x] ++; } } long long cnt = 0LL; for(auto &a:mp){ long long tt = a.first; long long ok = 0LL,ng = 1000000001; while(ng-ok>1){ long long mid = (ok+ng)/2; long long t = N; t /= mid; t /= mid+K; if(t<=0){ ng = mid; continue; } if(mid * (mid+K)<=tt)ok = mid; else ng = mid; } if(ok * (ok+K) == tt){ a.second++; cnt++; } } long long ans = 0LL; if(M>=2){ for(auto a:mp){ if(a.second==M)ans++; } } else{ long long ok = 0LL,ng = 1000000001; while(ng-ok>1){ long long mid = (ok+ng)/2; long long t = N; t /= mid; t /= mid+K; if(t<=0){ ng = mid; continue; } if(mid * (mid+K)<=N)ok = mid; else ng = mid; } ans = ok; ans -= cnt; for(auto a:mp){ if(a.second==1)ans++; } } cout<<ans<<endl; return 0; }