题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4772

sol :这个题卡了我一整天QAQ

   出题人简直丧心病狂,卡内存+卡常数QAQ

   题意就是,给你一个整数,让你求所有整数划分的方案数的价值和,价值是个函数

   长成这个样子:

   ∑划分方案数

   然后就是,考虑枚举pi和pj,如何算这个二元组在整数划分中出现的次数

   记sum[i]为将i进行整数划分的方案数(实际操作时为避免数组下标为负所以将sum反向)

sum[]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(i==||j==) f[i][j]=;
else if(i==j) f[i][j]=(f[i][j-]+)%p;
else if(i<j) f[i][j]=f[i][j-];
else f[i][j]=(f[i-j][j]+f[i][j-])%p;
}
sum[i]=f[i][i];
}

   当pi!=pj的时候,枚举pi和pj出现的次数muli,mulj,那么答案即为ans[pi][pj]+=sum[n-pi*muli-pj*mulj]

   而当pi=pj时,同样枚举pi出现的次数,我们要考虑两两组合的方案数

     即ans[pi][pi]+=muli*(muli-1)/2*(sum[muli*pi]-sum[(muli+1)*pi])

   然后我到这就不会了QAQ,于是去请教了Nbc和Claris,%%%

   Nbc表示这个题就是个暴力随便搞搞就行了......我:

   Claris表示其实这个g是个积性函数......我:

   好了这个题可以做了QAQ

   我们考虑g(n)在n为质数的情况下的值为2n-2,所以直接预处理线性筛一发g(x)就行了QAQ

   然后对于那个F(i,j)我们可以预处理一发gcd和pow就可以O(1)做了

   于是我们的做法就是,枚举不相等的i和j,统计答案

for(int i=;i<=n;i++)
for(int j=i+;j<=n-i;j++)
for(int muli=;muli*i+j<=n;muli++)
for(int mulj=;mulj*j+muli*i<=n;mulj++)
ans+=g[a[F(i,j)]]*sum[muli*i+mulj*j]%p,ans%=p;

   然后再枚举相等的i和j,统计答案

for(int i=;i<=n;i++)
for(int muli=;muli*i<=n;muli++)
ans=(ans+g[a[F(i,i)]]*muli*(muli-)/*(sum[muli*i]-sum[(muli+)*i]+p))%p;

   然后我们就愉悦的发现他0ms TLE了

   哦....原来是define int long long炸内存了啊QAQ

   简单的改了改然后交上去,发现他又偷♂税的T掉了......

   我们发现在统计不相等的i和j时的取模操作太多了QAQ

   于是我们可以手动实现一发取模操作...然而我并不会乘法取模,怎么办呢?

   我们发现乘法取模是因为乘了一个g[],然而F(i,j)的范围只有1e5,奥妙重重

   考虑开一个数组Cnt记录F的每个值的访问次数,这样的话在后面一次性统计即可

for(int i=;i<=n;i++)
  for(int j=i+;j<=n-i;j++)
    for(int muli=;muli*i+j<=n;muli++)
      for(int mulj=;mulj*j+muli*i<=n;mulj++)
        mod(Cnt[F(i,j)],sum[muli*i+mulj*j]);
for(int i=;i<K;i++) ans+=1LL*g[a[i]]*Cnt[i]%p,ans%=p;

   于是这道题就可以切掉了QwQ

   附上完整代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int p=1e9+;
const int Mx1=;
const int Mx2=1e7+;
int tp,n,K,a[Mx2],sum[Mx1],f[Mx1][Mx1],gcd[Mx1][Mx1],mul[Mx1][Mx1];
int cnt,ans,pri[Mx2],tmp[Mx2],g[Mx2],b[Mx1];
bool jud[Mx2];
inline void pre()
{
sum[n]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(i==||j==) f[i][j]=;
else if(i==j) f[i][j]=(f[i][j-]+)%p;
else if(i<j) f[i][j]=f[i][j-];
else f[i][j]=(f[i-j][j]+f[i][j-])%p;
}
sum[n-i]=f[i][i];
}
g[]=,g[]=;
for(int i=;i<=1e7;i++)
{
if(!jud[i]) pri[++cnt]=tmp[i]=i,g[i]=(*i-)%p;
for(int j=;j<=cnt&&i*pri[j]<=1e7;j++)
{
jud[i*pri[j]]=;
if(i%pri[j])
tmp[i*pri[j]]=pri[j],
g[i*pri[j]]=g[i]*g[pri[j]]%p;
else
{
tmp[i*pri[j]]=tmp[i]*pri[j];
if(tmp[i]!=i) g[i*pri[j]]=1LL*g[i/tmp[i]]*g[tmp[i]*pri[j]]%p;
else g[i*pri[j]]=(1LL*g[i]*pri[j]+i*pri[j]-i)%p;
break;
}
}
}
for(int i=;i<=n;i++) gcd[i][]=gcd[][i]=gcd[i][i]=i,gcd[][i]=gcd[i][]=;
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
{
if(!gcd[i][j]) gcd[i][j]=gcd[j][i-j];
gcd[j][i]=gcd[i][j];
}
for(int i=;i<=n;i++)
{
mul[i][]=;
for(int j=;j<=n;j++) mul[i][j]=(1LL*mul[i][j-]*i)%K;
}
} inline int F(int pi,int pj)
{
if(tp==) return %K;
if(tp==) return (gcd[pi][pj])%K;
if(tp==) return (mul[pi][pj]+mul[pj][pi]+(pi^pj))%K;
} inline void mod(int &x,const int &y){
x+=y;
if (x>=p) x-=p;
} int Cnt[Mx2];
int main()
{
scanf("%d%d%d",&tp,&n,&K);
for(int i=;i<K;i++) scanf("%d",&a[i]);
pre();
for(int i=;i<=n;i++)
for(int j=i+;j<=n-i;j++)
for(int muli=;muli*i+j<=n;muli++)
for(int mulj=;mulj*j+muli*i<=n;mulj++)
mod(Cnt[F(i,j)],sum[muli*i+mulj*j]);
for(int i=;i<K;i++) ans+=1LL*g[a[i]]*Cnt[i]%p,ans%=p;
for(int i=;i<=n;i++)
{
for(int muli=;muli*i<=n;muli++)
{
int Tmp=1LL*muli*(muli-)/*(sum[muli*i]-sum[(muli+)*i]+p)%p;
mod(ans,1LL*g[a[F(i,i)]]*Tmp%p);
}
}
cout<<ans<<endl;
return ;
}

   

bzoj4772 显而易见的数论的更多相关文章

  1. [BZOJ4772]显而易见的数论(数论)

    4772: 显而易见的数论 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 76  Solved: 32[Submit][Status][Discuss ...

  2. bzoj 4772 显而易见的数论——拆分数(五边形数定理)+线性筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4772 题解:https://blog.csdn.net/Dream_Lolita/artic ...

  3. PKUSC2018训练日程(4.18~5.30)

    (总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...

  4. 卡特兰数 Catalan数 ( ACM 数论 组合 )

    卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1)  编辑 收藏 引用 所属分类: ACM ( 数论 ...

  5. 简单数论总结1——gcd与lcm

    并不重要的前言 最近学习了一些数论知识,但是自己都不懂自己到底学了些什么qwq,在这里把知识一并总结起来. 也不是很难的gcd和lcm 显而易见的结论: 为什么呢? 根据唯一分解定理: a和b都可被分 ...

  6. Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和

    下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...

  7. [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环

    E. Ehab's REAL Number Theory Problem 数论+图论 求最小环 题目大意: 给你一个n大小的数列,数列里的每一个元素满足以下要求: 数据范围是:\(1<=a_i& ...

  8. 【题解】localmaxima 数论

    # T749 localmaxima 权限限制没有超链接 题目描述 Description 给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmax ...

  9. Codeforces Round #382 Div. 2【数论】

    C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...

随机推荐

  1. Smartforms 设置纸张打印格式

    在sap做一个打印报表,要先设置一个纸张打印格式,下面以工厂中常用来打印的针孔纸为例,在sap设置该纸张的打印格式,以用于报表: 1.运行事务代码SPAD:选择工具栏上的[完全管理]按钮——>选 ...

  2. 腾讯云负载均衡CLB

    负载均衡 使用场景: ①购买一个负载均衡LB实例 ②一级.二级域名都解析到VIP上 ③创建HTTP/HTTPS监听器 ④绑定云主机 在nginx中只需要配置好伪静态和相关设置就ok了

  3. Linux实战教学笔记15:用户管理初级(下)

    第十四节 用户管理初级(下) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,用户查询相关命令id,finger,users,w,who,last,lastlog,gr ...

  4. 交换机基础配置之stp生成树实验

    实验的要求是以上面的拓扑图为例,查看当前根桥的所在并把三成交换机switch1指定为根桥 我们可以用show spanning-tree来查看stp的信息 输入后会显示两部分 上面一部分为当前交换机自 ...

  5. IE hack 和手机尺寸

        来自为知笔记(Wiz)

  6. JQuery制作网页—— 第三章 JavaScript操作DOM对象

    1. DOM:Document Object Model(文档对象模型):          DOM操作:                   ●DOM是Document Object Model的缩 ...

  7. scrapy--dbmeinv

    第一次将自己的爬虫文件与大家分享.豆瓣美女网页图片爬取.比较简单,但很实用.给大家提供思路为主,增强个人的爬虫能力.希望能帮助到大家!!! 好了,让我们进入正题. 先给大家看下成果!!!激励大家赶快行 ...

  8. 正则表达式re.S的用法

    正则表达式re.S的用法 在Python的正则表达式中,有一个参数为re.S.它表示"."(不包含外侧双引号,下同)的作用扩展到整个字符串,包括"\n".看如下 ...

  9. Redis ---------- 持久化(AOF)操作

    每小时做一次快照持久化 8:00 快照持久化 9:00 快照持久化 10:00  快照持久化  上帝想玩弄人类,突然停电,55万个key丢失了 11:00 快照持久化 解决方案: 8:00-9:00在 ...

  10. python flask学习第2天 URL中两种方式传参

    新创建项目   自己写个url映射到自定义的视图函数 在url中传递参数 app.py from flask import Flask app = Flask(__name__) @app.route ...