如何用C#强行A掉洛谷高精模板(P1601)
30 January 2019 |
duanyll | Tags:
OI
dotnet
题解
众所周知,洛谷的C# Mono默认是没有引用System.Numerics
这个程序集的,也就是说不能像Java或者Python一样直接调用内建的高精度类型
按照正常思路,但在洛谷会CE的程序
using System;
using System.Numerics;
namespace Solution
{
class Program
{
public static int Main(string[] args)
{
var a = BigInteger.Parse(Console.ReadLine();
var b = BigInteger.Parse(Console.ReadLine();
Console.WriteLine(a+b);
}
}
}
但是我们可以用反射技术来强行动态加载程序集!这样就可以动态调用高精度类了,详情见代码
using System;
using System.Reflection;
namespace Solution
{
class Program
{
public static void Main(string[] args)
{
try
{
var Numerics = Assembly.LoadFile("/usr/lib/mono/4.5/System.Numerics.dll");
Type BigInteger = Numerics.GetType("System.Numerics.BigInteger");
dynamic a = BigInteger.InvokeMember("Parse", BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public, null, null, new object[] { Console.ReadLine() });
dynamic b = BigInteger.InvokeMember("Parse", BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public, null, null, new object[] { Console.ReadLine() });
Console.WriteLine(BigInteger.InvokeMember("Multiply", BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public, null, null, new object[] { a, b }).ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
顺便吐槽一下洛谷的编译器版本是mono4.6,然而运行时版本是4.5,猜了好久路径…
还有,不知道是不是反射导致的性能低下,此方法对于P1919会T掉
最后吐槽一句洛谷MarkDown编辑器的弱智自动空行,极其不适,能否给个选项关掉…