結果
| 問題 | No.886 Direct |
| コンテスト | |
| ユーザー |
leaf_1415
|
| 提出日時 | 2019-09-16 22:56:04 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2,853 ms / 4,000 ms |
| コード長 | 1,494 bytes |
| コンパイル時間 | 672 ms |
| コンパイル使用メモリ | 63,496 KB |
| 実行使用メモリ | 222,604 KB |
| 最終ジャッジ日時 | 2024-07-07 02:35:37 |
| 合計ジャッジ時間 | 26,521 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#include <iostream>
#include <vector>
#define llint long long
#define mod 1000000007
using namespace std;
llint modpow(llint a, llint n)
{
if(n == 0) return 1;
if(n % 2){
return ((a%mod) * (modpow(a, n-1)%mod)) % mod;
}
else{
return modpow((a*a)%mod, n/2) % mod;
}
}
llint comb(llint n)
{
n %= mod;
llint ret = n*(n-1+mod)%mod;
ret *= modpow(2, mod-2), ret %= mod;
return ret;
}
llint h, w;
vector<llint> pvec;
bool prime[3000005];
vector<llint> vec[3000005];
llint dp[3000005];
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> h >> w;
llint ans = (h-1) * w % mod;
ans += (w-1) * h % mod, ans %= mod;;
for(int i = 2; i < 18000; i++){
if(prime[i]) continue;
for(int j = 2*i; j <= 3000000; j += i) prime[j] = true;
}
for(int i = 2; i <= 3000000; i++) if(!prime[i]) pvec.push_back(i);
for(int i = 0; i < pvec.size(); i++){
int p = pvec[i];
for(int j = 1; p*j <= w; j++) vec[p*j].push_back(p);
}
llint tmp = 0;
for(int i = 1; i <= w; i++){
llint n = vec[i].size(), N = 1<<n, sum = 0;
for(int j = 0; j < N; j++){
llint pop = 0, mul = 1;
for(int k = 0; k < n; k++){
if(j & (1<<k)) pop++, mul *= vec[i][k];
}
llint val = (h-1) / mul;
val = h*val%mod - val*(val+1)/2%mod*mul%mod + mod, val %= mod;
if(pop % 2) sum += mod - val, sum %= mod;
else sum += val, sum %= mod;
}
sum *= w-i, sum %= mod;
tmp += sum, tmp %= mod;
}
tmp *= 2, tmp %= mod;
ans += tmp, ans %= mod;
cout << ans << endl;
return 0;
}
leaf_1415