数论杂题
来源:互联网 发布:华兴资本 知乎 编辑:程序博客网 时间:2024/06/03 13:21
orz链接
杂题:
1.hdu1717
题意:将小数化为分数(小数可为循环小数和不循环的普通小数)
[题解]
2.hdu1452
题意:输入x,求2004^x的所有因子的和,结果对29取余。
题解:
∴
3.hdu2483
题意:给定一个由0和1构成的n*m矩阵。问矩阵中符合条件的子矩阵有多少个?条件:
1.边长大于等于2的正方形;
2.四边都没有0;
3.除4边外的部分,0和1的个数差小于等于1
题解:
便能快速知道一个边长为t的正方形中“1”的个数
便能快速判断一个边长为t的正方形四周是否都为“1”
4.poj3604
题意:输入一个数n,它的因子为ai,对于每个ai,bi表示ai的因子数。现在求的是
题解:
不妨设
则:
∴
∵
∴代入原式变可求得答案
5.poj2115
题意:求x,使得
题解:扩展欧几里得
6.poj3358
题意:将一个分数转化为二进制,求二进制从哪一位循环,循环节是多大。
题解:
以1/10为例:
取模前:
取模后:
然后就发现了一些奥妙重重的东东~~
由于是二进制,所以分子可以表示为
根据欧拉定理,
7.hdu4091
题意:读入
题解:贪心,将价值与体积比大(称为价值比)的优先放入。但体积限制,这样还不可以,还需要枚举减少价值比大的宝石个数,是否可以增大所求价值。又我们可以知道对于体积是
8.poj1845
题意:求
题解:首先将
因子和=
那么我们现在的最大问题就在于如何求
法一:公式法
等比数列求和公式:
法二:二分法
9.hdu3864
题意:求n是否只有4个因子,如果是就输出除1外的所有因子。
题解:这题n太大(n<=1e18),所以不能直接求解,需要用到Pollard_rho算法和Miller_Rabin算法。
10.poj1430
题意:
第二类斯特林数的奇偶问题。
求
分析:
由于数据较大,不能根据第二类斯特灵数来求解S(n,m)的值,那么就要用到Sierpinski三角形中的一个结论:
组合数C(N,K)为奇数当且仅当
有了这个公式,题目就简单了
11. 51NOD1130
题意:
求
分析:
斯特林公式:
(其中
长度就是
∴
12. 51NOD1386
题意:
从1~n中选出尽可能少的数,使得剩下的每个数至少和一个被选择的数不互质,k不能被选择
数据范围:n,k<=1000
分析:
题目相当于被选择的数分解质因数后包含所有质因数
每个数分解质因数之后最多只含有一个大于sqrt(n)的质因子
以这个质因子为依据将所有数进行分类
同时记录质因子2、3、5、7、11、13、17、19、23、29、31有没有出现过
然后就可以高兴地动归了~
因为大于31的数的质数一定要选,但它可以和2~31的质数合并,那么我们一开始就加上31以后的质数个数,在选大于31的合数分解后有大于31的质数是,就相当于没有加数。(还是看代码吧)
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=3000;int v[N],p[N],pre[N],f[2][N],c[2][N];int n,k,tot,id[N],cas,key[N],mx[N];int min(int x,int y){return x<y?x:y;}int main(){ freopen("a.in","r",stdin); int T;scanf("%d",&T); v[1]=1; for (int i=2;i<N;i++){ if (!v[i]) p[++tot]=i,pre[i]=1,v[i]=1; for (int j=1;j<=tot && i*p[j]<N;j++){ pre[i*p[j]]=i; v[i*p[j]]=1; if (i%p[j]==0) break; } } for (int i=1;i<=tot;i++) id[p[i]]=i; for (int i=1;i<N;i++){ int t=0,kk=i; while (kk!=1){ int tt=kk/pre[kk]; if (tt<=31){ if (!(t&(1<<(id[tt]-1)))) t+=(1<<(id[tt]-1)); } mx[i]=max(mx[i],tt); kk=pre[kk]; } key[i]=t; } while (T--){ scanf("%d%d",&n,&k); if (cas==22) printf(""); memset(f,0x16,sizeof(f)); f[0][0]=0; int len=1; while (p[len]<=n) len++;len--; int ans=(len>11)?len-11:0; len=min(len,11); int p=1; for (int i=1;i<=n;i++){ int t=key[i]; for (int j=0;j<(1<<len);j++){ f[p][j]=f[p^1][j]; if ((t&j)==t && i!=k){ int tt=0; if (mx[i]>31) tt=1; if (f[p][j]>f[p^1][j^t]+1-tt) f[p][j]=min(f[p][j],f[p^1][j^t]+1-tt); } } for (int j=0;j<(1<<len);j++) f[p^1][j]=370546198; f[p^1][0]=0; p^=1; } printf("Case #%d: %d\n",++cas,f[p^1][(1<<len)-1]+(k!=1)+ans); }}
代码好像更难懂....
13.☆bzoj2159☆
题解
14.bzoj4555
题解
15.bzoj3992
题意:
题目大意:给定n(n<=10^9),质数m(3<=m<=8000),1<=x=m,以及一个[0,m-1]区间内的集合S,求有多少长度为n的数列满足每个元素都属于集合S且所有元素的乘积mod m后=x
分析:
首先对于m,求出它的原根g,于是就将乘法变成加法的问题了。
再快速幂一波就好了,每次将大于m的数加到前面
void power(ll *a,int tim){ b[0]=1; while (tim){ ntt(a,L,1); if (tim&1){ ntt(b,L,1); for (int i=0;i<L;i++) b[i]=a[i]*b[i]; ntt(b,L,-1); for (int i=L-1;i>=m-1;i--) b[i-m+1]=(b[i-m+1]+b[i])%mod,b[i]=0; } for (int i=0;i<L;i++) a[i]=a[i]*a[i]%mod; ntt(a,L,-1); for (int i=L-1;i>=m-1;i--) a[i-m+1]=(a[i-m+1]+a[i])%mod,a[i]=0; tim/=2; }}int main(){........//核心代码 for (int i=0,t=1;i<m-1;t=t*root%m,i++) pos[t]=i;//求出每一个余数相当于原根的几次方 for (int i=1;i<=len;i++) if (s[i]) a[pos[s[i]]]++; power(a,n); printf("%lld\n",b[pos[x]]);}
16.bzoj3456or xsy1332
题意:
求出n个点的简单(无重边无自环)无向连通图数目
题解
17.bzoj3625
题意:
给定
给定
答案对
分析:
f(x)表示权值总和为x的树的总数。
c(x)表示有没有权值为x的数。
搞出生成函数F,C
于是乎
∴
发现有两种可能,嗯~检验一下。
注意到f(0)=1;
∴当
∴
∴
这样就变成了多项式开根和多项式逆元的傻题了。
18.常见排列组合
- 数论杂题
- 韩信点兵---数论趣题
- 数论证明题(1)
- 数论若干题
- codeforces 数论分析题
- 数论五题
- 构造题(数论)
- 数论第一题HDU1164
- Steps 数论水题
- poj1845 数论好题
- poj1519 数论简单题
- 数论刷题
- kuangbin 数论 A题
- kuangbin 数论 E题
- [数论] HAOI2012 容易题
- 数论
- 数论
- 数论
- Behavior类
- UDP Socket编程(C++)
- zabbix3.2 Less than 25% free in the configuration cache 解决方法
- 数据结构一(栈-数组实现)
- Cocos2d-x 学习----通过OpenGL绘图过程学习场景、层、与精灵的关系。
- 数论杂题
- 在IDEA中新建的maven项目,无法创建.scala文件
- Hash算法总结
- Codeforces Round #392 (Div. 2)
- [SMOJ1782]最大利润
- Ajax获取数据时出现XMLHttpRequest cannot load
- ORACLE查看并修改session和连接最大数
- Ant打包Android项目,生成apk
- Linux服务器下jdk的安装配置、Tomcat的安装及JavaWeb项目的部署