首页 > 其他分享 >P2480 古代猪文 题解

P2480 古代猪文 题解

时间:2023-05-25 20:35:08浏览次数:39  
标签:ivf 4679 vf int 题解 sum 1LL 猪文 P2480

题意:求

\[g^{\sum_{k\mid n}{n\choose k}} \]

对 \(999911659\) 取模。

\(1\le n,g\le 10^9\)。

思路:

首先根据欧拉定理,题目转化为求 \(\displaystyle\sum_{k\mid n}{n\choose k}\) 对 \(999911658\) 取模的值。

模数为合数不是很好做,因式分解发现 \(999911658=2\times 3\times 4679\times35617\),考虑中国剩余定理,分别求出 \(\displaystyle\sum_{k\mid n}{n\choose k}\) 模 \(2,3,4679,35617\) 的值,用中国剩余定理合并即可。

由于 \(n\) 的因数个数是 \(\mathcal{O}(\sqrt{n})\) 的,直接暴力枚举 \(k\) 然后卢卡斯定理算组合数即可。

一道挺好的综合练习题。

#include <iostream>

using namespace std;

const int kM = 999911659;
const int kL[4] = {2, 3, 4679, 35617};

int n, g;

int P(int b, int e, int p) {
  int s = 1;
  for (; e; e >>= 1, b = 1LL * b * b % p) {
    (e & 1) && (s = 1LL * s * b % p);
  }
  return s;
}
struct Solver {
  static const int kP = 3.6e4 + 1;

  int p, vf[kP], ivf[kP];
  Solver(int p) : p(p) {
    vf[0] = 1;
    for (int i = 1; i < p; ++i) {
      vf[i] = 1LL * vf[i - 1] * i % p;
    }
    ivf[p - 1] = P(vf[p - 1], p - 2, p);
    for (int i = p - 1; i >= 1; --i) {
      ivf[i - 1] = 1LL * ivf[i] * i % p;
    }
  }
  int C(int n, int m) {
    if (n < p && m < p) {
      return n >= m ? 1LL * vf[n] * ivf[m] % p * ivf[n - m] % p : 0;
    }
    return 1LL * C(n / p, m / p) * C(n % p, m % p) % p;
  }
  int operator()() {
    int ans = 0;
    for (int k = 1; k * k <= n; ++k) {
      if (n % k == 0) {
        ans = (ans + C(n, k)) % p;
        if (k != n / k) {
          ans = (ans + C(n, n / k)) % p;
        }
      }
    }
    return ans;
  }
};

int main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  cin >> n >> g;
  g %= kM;
  if (!g) {
    cout << '0';
    return 0;
  }
  int s = 0;
  for (int i = 0; i < 4; ++i) {
    int vm = (kM - 1) / kL[i];
    int im = P(vm, kL[i] - 2, kL[i]);
    s = (s + 1LL * Solver(kL[i])() * vm % (kM - 1) * im % (kM - 1)) % (kM - 1);
  }
  cout << P(g, s, kM);
  return 0;
}

标签:ivf,4679,vf,int,题解,sum,1LL,猪文,P2480
From: https://www.cnblogs.com/bykem/p/17432782.html

相关文章

  • JOISC 2021 题解
    JOISC21フードコート(FoodCourt)首先我们发现我们这个删除实际上可以假删除,我们每次问询时求出这个队列目前被删了几个(维护区间加,区间\(\max(0,A-x)\))就可以把删除操作给弄掉了。然后我们考虑对商店做扫描线!因为我们现在其实就是对商店的单点问询,我们这个加入操作也可以在左......
  • 【题解】Codeforces Round 737 (CF1557)
    VP情况:solve:4/5rank:431st评价:VP了一下,我这个shaberB直接5发罚时,耽误了二十多分钟,以及被D各种细节差点搞死。A.EzzatandTwoSubsequences(*800)题目描述:给定一个序列,将其分为\(2\)个组,要求这两个组的平均值之和最大,组内的数不要求在原序列中连续。题目分析:我们......
  • 【题解】CF1062E Company
    传送门先考虑如何求解区间LCA假设要我们求\(8\sim11\)的LCA。那么显然它们的LCA等效于8和11的LCA。发现8和11刚好是“最左”和“最右”的两个顶点,感性理解一下,就可以得出一个结论:区间LCA和dfs序最小的和最大的的LCA是等效的。(这个结论应该还......
  • 题解(教主的魔法)P2801
    题目教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是$N$个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为$1,2,\ldots,N$。每个人的身高一开始都是不超过$1000$的正整数。教主的魔法每次可以把闭区......
  • 常见问题解决 --- 安卓中一个类中的匿名类和另一个类中的匿名类无法相互传值
      runOnUiThread(newRunnable(){@Overridepublicvoidrun(){//在UI线程中执行的主代码textView.setText("Hello,world!");}});将上面更新主ui放置在匿名内部类的回调方法里即可传值给属性。......
  • AtCoder Beginner Contest 302 H. Ball Collector 题解
    AtCoderBeginnerContest302H.BallCollector题意跳过。可以视作将\(a_i,b_i\)之间连了一条边,然后\(a_i,b_i\)之间只能选一个等价于对于一条边只能选择其一个端点。那么对于只包含树的联通块而言,如果都选择儿子节点,那么会有一个根节点无法被选择上;而对于包含至少一个......
  • NOIP2014普及组试题题解
    1.珠心算测验代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=2e4+39+7;intmp[N],n,a[N],ans=0;intmain(){ cin>>n; for(inti=1;i<=n;i++)cin>>a[i]; for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++)......
  • 常见问题解决 --- Failed to build android app at server - class file for android.
    问题原因  这个错误主要是LocalBroadcastManager这个类被弃用了,而在库或者sdk中使用到了。解决办法build.gradle文件中添加implementation'com.android.support:support-v4:30.4.1'gradle.properties添加android.enableJetifier=true......
  • abc260_f Find 4-cycle 题解
    Find4-cycle题意有一个\(s+t\)个点\(m\)条边的简单无向图\(G\)。点标号为\(1\cdotss+t\),边标号为\(1\cdotsm\)。第\(i\)条边连接点\(u_i\)和\(v_i\)。如果\(G\)中包含一个大小为\(4\)的简单环,选择任意一个并按任意顺序输出环上的\(4\)个点。若不存......
  • abc260_e At Least One 题解
    AtLeastOne题意给定一个整数\(m\)和\(n\)对数\((a_i,b_i)\),我们定义一个\(f(x)\)函数表示满足以下要求的整数序列数量:整数序列为\((1,2,3\cdotsm)\)的一个子段且序列长度为\(x\)。对于\(1\leqslanti\leqslantn\),满足\(a_i\)或者\(b_i\)在整数序列......