[51nod1965]奇怪的式子

description

求\[\prod_{i=1}^n\sigma_0(i)^{\mu(i)+i}(mod\ 10^{12}+39)\]其中\(\sigma_0(i)\)表示约数个数。

solution

菜鸡fdf现在才学\(Min\_25\)筛。

拆幂即转化为\((\prod_{i=1}^n\sigma_0(i)^{\mu(i)})(\prod_{i=1}^n\sigma_0(i)^i)\)。

Part 1

求\[\prod_{i=1}^n\sigma_0(i)^{\mu(i)}\]

唔[托腮]......考虑一下μ(i)≠0的条件,每个质因子只出现一次。--GuessYCB

因此\[\prod_{i=1}^n\sigma_0(i)^{\mu(i)}=2^{\sum_{i=1}^{n}\mu(i)c(i)}\]

即只须计算\(\sum_{i=1}^{n}\mu(i)c(i)\),其中\(c(i)\)表示\(i\)的质因子个数。

考虑怎么用\(Min\_25\)筛筛出这个东西。

首先我们可以很轻易的算出\(g(n,P)=\sum_{i=1}^{n}[i\in Prime]\mu(i)c(i)\)。

如果正常的算\(S(n,j)\),化简即\(S(n,j)=\sum_{i=j}^{P}f(p_i)S(\lfloor\frac{n}{p_i}\rfloor,i+1)-\sum_{i=1}^{j}f(p_i)\),那么我们少算了由于\(p_i\)这个新的质因子加入而产生的对\(c(n)\)的贡献。

因此我们再开一个\(S‘(n,j)\)表示\(\sum_{i=1}^{n}[p_{min}(i)\ge p_j]\mu(i)\),在\(S\)的转移式中处理一下,这样就可以做了。

Part 2

求\[\prod_{i=1}^n\sigma_0(i)^i\]考虑对\(\sigma_0(i)\)进行质因数分解,于是有\[\prod_{i=1}^{n}\sigma_0(i)^{i}=\prod_{p\in Prime}\prod_{k=1}(k+1)^{s(n,p,k)}\]

其中\(s(n,p,k)\)表示\(1-n\)中有多少个数可以表示成\(p^ka(gcd(p,a)=1)\)的形式。

可以知道\(s(n,p,k)=p^ks(\lfloor\frac{n}{p^k}\rfloor)-p^{k+1}s(\lfloor\frac{n}{p^{k+1}}\rfloor)\),其中\(s(n)=\sum_{i=1}^{n}i\)

质数的乘积考虑分块。

当\(p\le\sqrt n\)时,直接枚举\(p\)和\(k\)即可,因为这种形式的枚举和\(Min\_25\)筛相同,因此复杂度也同级。

当\(p>\sqrt n\)时,可以知道\(k=1\)。那么\(s(n,p,k)=p^ks(\lfloor\frac{n}{p^k}\rfloor)\)。数论分块+\(Min\_25\)即可。

至此问题得到解决。

#include<bits/stdc++.h>
#define FL "a"
using namespace std;
typedef long long ll;
typedef long double dd;
const int N=1e6+10;
const ll mod=1e12+39;
const ll phi=mod-1;
inline ll read(){
  ll data=0,w=1;char ch=getchar();
  while(ch!=‘-‘&&(ch<‘0‘||ch>‘9‘))ch=getchar();
  if(ch==‘-‘)w=-1,ch=getchar();
  while(ch<=‘9‘&&ch>=‘0‘)data=data*10+ch-48,ch=getchar();
  return data*w;
}
inline void file(){
  freopen(FL".in","r",stdin);
  freopen(FL".out","w",stdout);
}

ll n;
inline void upd1(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
inline void dec1(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline void upd2(ll &a,ll b){a+=b;if(a>=phi)a-=phi;}
inline void dec2(ll &a,ll b){a-=b;if(a<0)a+=phi;}
inline ll mul1(ll a,ll b){ll r=(dd)a*b/mod;return a*b-r*mod;}
inline ll mul2(ll a,ll b){ll r=(dd)a*b/phi;return a*b-r*phi;}
inline ll poww(ll a,ll b){
  ll res=1;
  b=(b%phi+phi)%phi;
  assert(b>=0);
  for(;b;b>>=1,a=mul1(a,a))
    if(b&1)res=mul1(res,a);
  return res;
}

int cnt,pri[N];ll sump[N];bool vis[N];
inline void sieve(){
  register int i,j;
  for(vis[1]=1,i=2;i<N;i++){
    if(!vis[i])pri[++cnt]=i,sump[cnt]=sump[cnt-1],upd2(sump[cnt],i);
    for(j=1;j<=cnt&&1ll*i*pri[j]<N;j++){
      vis[i*pri[j]]=1;if(i%pri[j]==0)break;
    }
  }
}

int sqr,tot,id1[N],id2[N];ll w[N],sum[N],sp[N],f[N],g[N];
#define ID(x) (x<=sqr?id1[x]:id2[n/(x)])
inline ll solve(ll n){

  register ll ans,i,j,id,k,a,b,tmp;

  for(sqr=sqrt(n),tot=0,i=1;i<=n;i=j+1){
    j=n/(n/i);w[++tot]=n/i;
    w[tot]<=sqr?id1[w[tot]]=tot:id2[n/w[tot]]=tot;
  }

  for(i=1;i<=tot;i++){
    if(w[i]&1)sum[i]=mul2((w[i]+1)/2,w[i]);
    else sum[i]=mul2(w[i]/2,w[i]+1);
    sp[i]=sum[i];dec2(sp[i],1);
    g[i]=w[i]-1;
  }

  for(i=1;i<=cnt&&1ll*pri[i]*pri[i]<=n;i++)
    for(j=1;1ll*pri[i]*pri[i]<=w[j];j++){
      id=ID(w[j]/pri[i]);
      dec2(sp[j],mul2(pri[i],sp[id])),upd2(sp[j],mul2(pri[i],sump[i-1]));
      dec2(g[j],g[id]);upd2(g[j],i-1);
    }
  for(i=1;i<=tot;i++)f[i]=0,dec2(f[i],g[i]),g[i]=f[i];

  for(i=cnt;i;i--)
    if(1ll*pri[i]*pri[i]<=n)
      for(j=1;1ll*pri[i]*pri[i]<=w[j];j++){
    id=ID(w[j]/pri[i]);
    dec2(g[j],g[id]);dec2(g[j],i);
    dec2(f[j],f[id]);dec2(f[j],g[id]);dec2(f[j],mul2(2,i));
      }

  ans=poww(2,f[1]);

  for(i=1;i<=cnt&&1ll*pri[i]*pri[i]<=n;i++)
    for(k=1,a=pri[i],b=1ll*pri[i]*pri[i];a<=n;k++,a=b,b*=pri[i]){
      tmp=mul2(a,sum[ID(n/a)]);if(b<=n)dec2(tmp,mul2(b,sum[ID(n/b)]));
      ans=mul1(ans,poww(k+1,tmp));
    }
  for(i=pri[i-1]+1,j=n/(n/i);i<j;i++)
    if(!vis[i])ans=mul1(ans,poww(2,mul2(i,n/i)));
  for(;i<=n;i=j+1){
    j=n/(n/i);
    tmp=sp[ID(j)];dec2(tmp,sp[ID(i-1)]);
    tmp=mul2(tmp,sum[ID(n/i)]);
    ans=mul1(ans,poww(2,tmp));
  }
  return ans;
}

int main()
{
  int T=read();sieve();
  while(T--){
    n=read();
    printf("%lld\n",solve(n));
  }
  return 0;
}

原文地址:https://www.cnblogs.com/cjfdf/p/10226424.html

时间: 2024-07-31 13:03:53

[51nod1965]奇怪的式子的相关文章

[51nod1965]奇怪的式子(Min_25筛)

题面 传送门 题解 好毒啊--\(de\)了一个晚上的\(bug\)-- 题目所求为 \[\prod_{i=1}^n\sigma_0(i)^{\mu(i)+i}(mod\ 10^{12}+39)\] 那么我们把式子拆开来,变成 \[(\prod_{i=1}^n\sigma_0(i)^{\mu(i)})(\prod_{i=1}^n\sigma_0(i)^i)\] 左边 现在就是要求\(\prod_{i=1}^n\sigma_0(i)^{\mu(i)}\) 我们发现只有在所有质因子都不超过\(1\)

【51nod1965】奇怪的式子

Portal --> 51nod1965 Solution 怎么说呢..这题..做的有点痛苦.. 首先看这个式子长得..比较奇怪,指数里面那个加号有点烦人,而且这个函数不是一个积性函数也有点烦人,那就考虑把这个函数拆成两部分来算 \[ \prod\limits_{i=1}^{n}\sigma_0 (i)^{\mu (i)+i}=\prod\limits_{i=1}^{n}\sigma_0(i)^i\cdot\prod\limits_{i=1}^{n}\sigma_0(i)^{\mu (i)} \

gym 101858

我这个傻逼被治了一下午. 大好的橘势,两个小时6T,去看L,哇傻逼题.然后我跑的最短路T到自闭 最后十几分钟去想了下A,一直在想如何表示状态..就是想不到二进制搞一下... 然后游戏结束了..以后我就是蓝名之耻了.(注:此称号送给一场比赛里排名最低的蓝名选手) 所以非常凄惨到现在也只有8个,,我还想AK来着,,毕竟有紫名选手AK了,那我1800多分也差不多叭 注意:堆优化dijkstra的复杂度是mlogm!!! 注意:堆优化dijkstra的复杂度是mlogm!!! 注意:堆优化dijkstr

模拟82 题解

A. D2T1 因为最终答案只需要大小为$n$的排列的返回值的期望. 我们并不关注排列内部的内容. 所以不妨设长度为$n$的排列的返回值的期望为$f_n$,长度为$n$的排列的逆序对个数为$g_n$. 那么有$f_n=\frac{\sum \limits_{i=0}^{n}\binom{n}{i}*f_i}{2^n}+g_n$. 显然随机排列中正序对和逆序对个数应当是相同的,并且二者相加为$\frac{n*(n-1)}{2}$,故$g_n=\frac{n*(n-1)}{4}$. 然而受到$D1T

修改 const 的值之后的奇怪变化

1 #include <iostream> 2 3 int main(void) 4 { 5 const int a = 10; 6 int* p = (int*)&a; 7 *p = 20; 8 std::cout << a << "|" << &a << std::endl; 9 std::cout << *p << "|" << p <<

第7题:奇怪的国家&amp;第8题:字符串长度

第7题:奇怪的国家 有一个奇怪的国家,里面的国民对于事情的态度永远只有两面.当两个人遇到一起讨论一个事情的时候--两个持赞同观点的人遇到一起后会对这个事情都继续赞同:一个持赞同观点的人遇到一个持不赞同观点的人的时候,两人都会不再继续赞同:两个持不赞同观点的人遇到一起讨论后反而会对这个事情开始赞同. 输入包括两行,每行包括N个数字(1≤N≤50),分别表示两个人对于N个事情对应的看法--0表示不赞同.1表示赞同. 输出包括一行,包括N个数字,表示两人相遇后,对于这N件事情的最终看法. 样例输入 1

洛谷 P2759 奇怪的函数

P2759 奇怪的函数 题目描述 使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^x 达到 n 位数字的最小正整数 x 输入输出样例 输入样例#1: 11 输出样例#1: 10 说明 n<=2000000000 思路:根据换底公式 可以推得,当x*log10(x)==n-1时x^x恰好为n位数,所以二分查找即可,在特判一下为1的情况. #include<cmath> #include<cstdio>

做一个手机端页面时,遇到了一个奇怪的问题:字体的显示大小,与在CSS中指定的大小不一致

最近在做一个手机端页面时,遇到了一个奇怪的问题:字体的显示大小,与在CSS中指定的大小不一致.大家可以查看这个Demo(记得打开Chrome DevTools). 就如上图所示,你可以发现,原本指定的字体大小是24px,但是最终计算出来的却是53px,看到这诡异的结果,我心中暗骂一句:这什么鬼! 随后开始对问题各种排查:某个标签引起的?某个CSS引起的?又或者是某句JS代码引起的.通过一坨坨的删代码,发现貌似都不是.我不禁又骂,到底什么鬼!不过中间还是发现了一些端倪:当页面中的标签数量或者文本数

[jzoj]1383.奇怪的问题

Link https://jzoj.net/senior/#main/show/1383 Problem Alice总是会提出很多奇怪的问题,一天他让他的朋友Bob跟他一起研究一个奇怪的问题.问题是:[A,B]中有多少个数满足组成这个数的数字之和为S,另一个问题是[A,B]内满足这一要求最小的数是哪个? 编程帮Bob解决这个问题. Solution 30分 显然可以使用暴力枚举,像我这样的渣渣,考试的时候想到数位DP,设完一个不完整的状态,根本不知道如何统计答案 100分 聪明的人都知道,若要求