如何用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编辑器的弱智自动空行,极其不适,能否给个选项关掉…