求助dalao们,51nod1170实在是不会了,有没有大佬讲一下,有兴趣的可以告诉我,我提供AC代码。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Numerics; namespace Problem51Nod
{
class Program
{
public static void Main(String[] args)
{
//BigInteger m = BigInteger.Pow(5, 143) - 1;
//BigInteger n = BigInteger.Pow(2, 331) + 1;
//int k = 100;
BigInteger m = BigInteger.Parse(Console.ReadLine());
BigInteger n = BigInteger.Parse(Console.ReadLine());
int k = Convert.ToInt32(Console.ReadLine()); //Stopwatch timer = new Stopwatch();
//timer.Start();
Console.WriteLine(Cmn(m, n, k));
//timer.Stop();
//Console.WriteLine(timer.Elapsed);
} static BigInteger[][] PowerTable = new BigInteger[][];
static List<BigInteger[][]>[] PreTable = new List<BigInteger[][]>[];
static BigInteger[,] CMatrix; static void InitCMatrix(int l)
{
CMatrix = new BigInteger[l + , l + ];
for (int i = ; i <= l; i++)
CMatrix[i, ] = CMatrix[i, i] = ; for (int i = ; i <= l; i++)
for (int j = ; j * <= i; j++)
CMatrix[i, j] = CMatrix[i, i - j] = CMatrix[i - , j - ] + CMatrix[i - , j];
} static void InitPowerTab(int l, int p)
{
PowerTable[p] = new BigInteger[l + ];
PowerTable[p][] = ; for (int j = ; j < PowerTable[p].Length; j++)
PowerTable[p][j] = PowerTable[p][j - ] * p;
} static void InitData(int l, BigInteger max, int p)
{
PreTable[p] = new List<BigInteger[][]>();
BigInteger[] pre = MulTo(l, p);
BigInteger[,] cMatrix = new BigInteger[l + , l + ]; for (int i = ; i <= l; i++)
for (int j = ; j <= i; j++)
cMatrix[i, j] = CMatrix[i, j]; int power = ;
for (BigInteger i = p; i <= max; i *= p)
{
BigInteger[][] cTable = new BigInteger[p - ][];
cTable[] = pre;
for (int j = ; j < p; j++)
{
BigInteger[] next = ReplaceWith(cTable[], i * j % PowerTable[p][l], l, p, cMatrix); if (j < p - )
cTable[j] = MulMod(cTable[j - ], next, l, p);
else
pre = MulMod(cTable[j - ], next, l, p);
} PreTable[p].Add(cTable);
power++;
}
} static BigInteger Cmn(BigInteger m, BigInteger n, int l)
{
InitCMatrix(l);
InitPowerTab(l, );
InitPowerTab(l, );
BigInteger up5 = CalP(m, n, , l);
BigInteger up2 = CalP(m, n, , l);
BigInteger mod = ((up5 - up2) + PowerTable[][l]) % PowerTable[][l];
mod = IMod(PowerTable[][l], mod, PowerTable[][l]) * PowerTable[][l] + up2;
return mod;
} static BigInteger CalP(BigInteger m, BigInteger n, int p, int l)
{
BigInteger count = Count(m, p) - Count(n, p) - Count(m - n, p);
if (count > l) return ;
InitData(l, m, p);
BigInteger up = Cal(m, p, l) * PowerTable[p][(int)count];
BigInteger down = Cal(n, p, l);
down *= Cal(m - n, p, l);
down %= PowerTable[p][l];
up = IMod(down, up, PowerTable[p][l]);
return up;
} static BigInteger Count(BigInteger v, BigInteger mod)
{
BigInteger count = ; while (v > )
{
v /= mod;
count += v;
} return count;
} static List<BigInteger> Values = new List<BigInteger>();
static List<int> Mods = new List<int>(); static BigInteger Cal(BigInteger nums, int p, int l)
{
BigInteger numsBak = nums;
Values.Clear();
Mods.Clear(); while (numsBak > )
{
Values.Add(numsBak);
Mods.Add((int)(numsBak % p));
numsBak /= p;
} BigInteger result = ; for (int i = ; i < Values.Count; i++)
{
result *= CalSingle(i, p, l);
result %= PowerTable[p][l];
} return result;
} static BigInteger CalSingle(int cIndex, int p, int l)
{
int len = Mods[cIndex];
BigInteger sum = , last = (Values[cIndex] - len) % PowerTable[p][l];
BigInteger[] pre = new BigInteger[] { };
BigInteger result = ;
cIndex++; for (int i = Mods.Count - ; i >= cIndex; i--)
{
int index = Mods[i]; if (index > )
{
BigInteger modValue = , current = ;
foreach (var item in PreTable[p][i - cIndex][index - ])
{
if (item != )
current = (current + modValue * item) % PowerTable[p][l]; if (sum == || modValue == )
break; modValue = modValue * sum % PowerTable[p][l];
} if (i - cIndex + <= l)
sum = (sum + index * PowerTable[p][i - cIndex + ]) % PowerTable[p][l]; result = (result * current) % PowerTable[p][l];
}
} for (int i = ; i <= len; i++)
{
if (i % p == )
continue; result *= last + i;
result %= PowerTable[p][l];
} return result;
} static BigInteger[] MulTo(int l, int p)
{
BigInteger[] result = new BigInteger[] { }; for (BigInteger i = ; i < p; i++)
{
if (i % p == )
continue; BigInteger[] b = new BigInteger[] { i, };
result = MulMod(result, b, l, p);
} return result;
} static BigInteger[] MulMod(BigInteger[] a, BigInteger[] b, int l, int p)
{
int len = Math.Min(l + , a.Length + b.Length - );
BigInteger[] result = new BigInteger[len]; for (int i = ; i < Math.Min(a.Length, l + ); i++)
{
if (a[i] == )
continue; int upper = Math.Min(b.Length, l - i + );
for (int j = ; j < upper; j++)
result[i + j] += a[i] * b[j];
} int last = ; for (int i = ; i < result.Length; i++)
{
result[i] %= PowerTable[p][l - i];
if (result[i] > )
last = i + ;
} if (last < result.Length)
Array.Resize(ref result, last); return result;
} //2次方算法,考虑大数是3次方 除以大进制的常数
static BigInteger[] ReplaceWith(BigInteger[] source, BigInteger into, int l, int p, BigInteger[,] cMatrix)
{
int len = source.Length;
len = Math.Min(len, l + );
BigInteger[] result = new BigInteger[len];
BigInteger[] power = new BigInteger[len];
power[] = ; for (int i = ; i < len; i++)
power[i] = power[i - ] * into % PowerTable[p][l]; for (int i = ; i < len; i++)
{
if (source[i] == )
continue; for (int j = ; j <= i; j++)
{
if (power[i] == ) continue;
var tmp = power[i - j] * source[i] % PowerTable[p][l - j];
if (tmp == ) continue;
result[j] += tmp * cMatrix[i, j];
}
} for (int i = ; i < result.Length; i++)
result[i] %= PowerTable[p][l - i]; return result;
} public static BigInteger EuclidExtend(BigInteger X, BigInteger Y, out BigInteger A, out BigInteger B)
{
if (Y == ) { A = ; B = ; return X; }
BigInteger quotient = X / Y;
BigInteger gcd = EuclidExtend(Y, X - Y * quotient, out A, out B);
BigInteger Temp = A; A = B; B = Temp - quotient * A;
return gcd;
} public static bool Linear(BigInteger X, BigInteger Y, BigInteger N, out BigInteger xResult, out BigInteger yResult)
{
BigInteger gcd = EuclidExtend(X, Y, out xResult, out yResult);
if (N % gcd != ) { return false; }
xResult = xResult * N / gcd % Y;
xResult = xResult >= ? xResult : xResult + Y;
yResult = yResult * N / gcd % X;
yResult = yResult <= ? yResult : yResult - X;
return true;
} public static BigInteger IMod(BigInteger A, BigInteger B, BigInteger P)
{
BigInteger x, y;
Linear(A, P, B, out x, out y);
return x;
}
}
}

51nod求助的更多相关文章

  1. 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛

    OwO 故事的起源大概是zcg前天发现51Nod晚上有场马拉松,然后他就很开心的过去打了 神奇的故事就开始了: 晚上的时候我当时貌似正在写线段树?然后看见zcg一脸激动告诉我第一题有九个点直接输出B就 ...

  2. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  3. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

  4. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  5. 51Nod 1278 相离的圆

    51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...

  6. 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...

  7. 【51Nod 1622】【算法马拉松 19C】集合对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...

  8. 【51Nod 1616】【算法马拉松 19B】最小集合

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1616 这道题主要是查询一个数是不是原有集合的一个子集的所有数的gcd. ...

  9. 【51Nod 1674】【算法马拉松 19A】区间的价值 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的 ...

随机推荐

  1. 数据库表,id自动递增重置,从1开始

    问题: 删除数据表的数据后,发现下次插入数据,主键id并没有重置,还是在原来基础上继续增加 解决: ; TRUNCATE table table_name; ; 参考: https://stackov ...

  2. Eclipse用java.util.Scanner时出现Resource leak: 'in' is never closed

    Resource leak: 'in' is never closed : 直译为资源泄漏,‘in’一直没被关闭. 由于声明了数据输入扫描仪(Scanner in),从而获得了配置内存,但是结束时却没 ...

  3. 王者荣耀交流协会 - 第7次Scrum会议(第三周)

    1.例会照片 照片由王超(本人)拍摄,组内成员刘耀泽,高远博,王磊,王玉玲,王超,任思佳,袁玥全部到齐. 2.时间跨度: 2017年11月2日 17:00 — 17:20 ,总计20分钟. 3.地 点 ...

  4. int 和 Integer的区别

    int是基本类型,默认值为0,int a=5;a只能用来计算,一般作为数值参数. Integer是引用类型,默认值为null, Integer b=5;b是一个对象,它可以有很多方法,一般做数值转换, ...

  5. 总结在Visual Studio Code创建Node.js+Express+handlebars项目

    一.安装node.js环境. Node.js安装包及源码下载地址为:https://nodejs.org/en/download/ 32 位安装包下载地址 : https://nodejs.org/d ...

  6. HDU 5203 Rikka with wood sticks 分类讨论

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5203 bc(chinese):http://bestcoder.hdu.edu.cn/con ...

  7. 团队作业4——第一次项目冲刺(Alpha版本)第二次

    一.会议内容 各人进行下一步工作 发现沟通流程问题并解决 二.各人工作 成员 计划任务 遇见难题 贡献比 塗家瑜(组长) 后端逻辑处理 无 1 张新磊 数据库搭建 无 1 姚燕彬 测试计划编写 无 1 ...

  8. 0302IT行业虽吃香,能完全享受这块“香"的也很难

    面对现今严峻的就业形势,越来越多的人希望通过职业技能培训或者学历提升来提高自己的综合技能以便能够顺利地应聘到自己理想中的工作. 在2014年十大最热门行业和职业排行榜中IT行业最吃香.在十大行业里,I ...

  9. 201621123037 《Java程序设计》第7周学习总结

    作业06-接口.内部类 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 答: 思维导图: 其他-笔记: 2. 书面作业 1. ArrayList代码分析 1.1 解释Arr ...

  10. Matlab中TCP通讯-实现外部程序提供优化目标函数解

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Matlab中TCP通讯-实现外部程序提供优化目标函数解     本文地址:http://te ...