結果
| 問題 |
No.377 背景パターン
|
| コンテスト | |
| ユーザー |
EmKjp
|
| 提出日時 | 2015-08-11 08:56:45 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 5,148 bytes |
| コンパイル時間 | 881 ms |
| コンパイル使用メモリ | 113,724 KB |
| 実行使用メモリ | 27,864 KB |
| 最終ジャッジ日時 | 2024-07-18 06:39:43 |
| 合計ジャッジ時間 | 5,088 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 WA * 4 |
| other | WA * 14 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.IO;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Numerics;
using System.Diagnostics;
partial class Solver {
static public long Gcd(long s, long t) {
return t != 0 ? Gcd(t, s % t) : s;
}
static public long Lcm(long s, long t) {
return s / Gcd(s, t) * t;
}
static public List<int> Divisors(int x) {
List<int> ret = new List<int>();
for (int i = 1; i * i <= x; i++) {
if (x % i == 0) {
ret.Add(i);
if (i != x / i) ret.Add(x / i);
}
}
ret.Sort();
return ret;
}
static Dictionary<long, long> memoPhi = new Dictionary<long, long>();
static public long Phi(long n) {
if (memoPhi.ContainsKey(n))
return memoPhi[n];
var nn = n;
long phi = n;
for (long i = 2; i * i <= n && i < n; i++) {
if (n % i == 0) {
while (n % i == 0) n /= i;
phi = phi / i * (i - 1);
}
}
if (n > 1) phi = phi / n * (n - 1);
return memoPhi[n] = phi;
}
static public long ExtendedGcd(long a, long b, ref long x, ref long y) {
if (b == 0) {
x = 1; y = 0;
return a;
} else {
long d = ExtendedGcd(b, a % b, ref y, ref x);
y -= a / b * x;
return d;
}
}
static public long Inverse(long a, long mod) {
long x = 0, y = 0;
if (ExtendedGcd(a, mod, ref x, ref y) == 1)
return (x + mod) % mod;
else
return -1;
}
static Dictionary<long, long> memoPow = new Dictionary<long, long>();
static public long ModPow(long x, long n, long mod) {
if (memoPow.ContainsKey(n)) return memoPow[n];
x %= mod;
if (n == 0)
return memoPow[n] = 1;
else if (n % 2 != 0)
return memoPow[n] = x * ModPow(x, n - 1, mod) % mod;
else
return memoPow[n] = ModPow((x * x) % mod, n / 2, mod);
}
public void Run() {
var H = ni();
var W = ni();
var K = ni();
const int mod = 1000000007;
var dH = Divisors(H);
var dW = Divisors(W);
long ans = 0;
foreach (var h in dH) {
foreach (var w in dW) {
ans += (long)(Phi(h) * Phi(w) % mod * ModPow(K, 1L * W * H / w / h * Gcd(w, h), mod) % mod);
ans %= mod;
}
}
ans = (ans * Inverse(1L * W * H, mod)) % mod;
cout.WriteLine(ans);
}
}
// PREWRITEN CODE BEGINS FROM HERE
partial class Solver : Scanner {
public static void Main(string[] args) {
new Solver(Console.In, Console.Out).Run();
}
TextReader cin;
TextWriter cout;
public Solver(TextReader reader, TextWriter writer)
: base(reader) {
this.cin = reader;
this.cout = writer;
}
public Solver(string input, TextWriter writer)
: this(new StringReader(input), writer) {
}
public int ni() { return NextInt(); }
public int[] ni(int n) { return NextIntArray(n); }
public long nl() { return NextLong(); }
public long[] nl(int n) { return NextLongArray(n); }
public double nd() { return NextDouble(); }
public string ns() { return Next(); }
}
public class Scanner {
private TextReader Reader;
private Queue<String> TokenQueue = new Queue<string>();
private CultureInfo ci = CultureInfo.InvariantCulture;
public Scanner()
: this(Console.In) {
}
public Scanner(TextReader reader) {
this.Reader = reader;
}
public int NextInt() { return Int32.Parse(Next(), ci); }
public long NextLong() { return Int64.Parse(Next(), ci); }
public double NextDouble() { return double.Parse(Next(), ci); }
public string[] NextArray(int size) {
var array = new string[size];
for (int i = 0; i < size; i++) array[i] = Next();
return array;
}
public int[] NextIntArray(int size) {
var array = new int[size];
for (int i = 0; i < size; i++) array[i] = NextInt();
return array;
}
public long[] NextLongArray(int size) {
var array = new long[size];
for (int i = 0; i < size; i++) array[i] = NextLong();
return array;
}
public String Next() {
if (TokenQueue.Count == 0) {
if (!StockTokens()) throw new InvalidOperationException();
}
return TokenQueue.Dequeue();
}
public bool HasNext() {
if (TokenQueue.Count > 0)
return true;
return StockTokens();
}
private bool StockTokens() {
while (true) {
var line = Reader.ReadLine();
if (line == null) return false;
var tokens = line.Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
if (tokens.Length == 0) continue;
foreach (var token in tokens)
TokenQueue.Enqueue(token);
return true;
}
}
}
EmKjp