bzoj2705: [SDOI2012]Longge的问题(数论)
来源:互联网 发布:java if else语句 编辑:程序博客网 时间:2024/06/05 07:09
题目传送门
水题。。
解法:
好简单的数论。。
gcd那么肯定有很多的gcd是一样的。。
那么只有n的因子才有可能成为gcd啊。
然后就想处理每个因子。
对于一个因子x。他成为公因数(不一定是最大公因数)的个数有n/x个。
那么减去那些不是最大公因数的方案数。
就去问比x大的每一个因子y。
如果x是y的因子。那么在y作为公因数的时候x肯定不是最大公因数。
所以要减去y为最大公因数的情况。
那么设f[i]表示为第i个因子(从小到大排序)
那么一开始f[i]=n/(第i个因子)
然后问每一个比他大的因子如果y%x==0那么f[i]就减去这个因子的f
然后果断查了一波2^32次方最大的有多少个因子。。
1344个。。
那不是n方可以过?
然后就打了个代码过掉了。
代码实现:
#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<queue>using namespace std;typedef long long ll;ll a[2100],f[2100],n;bool cmp(ll a,ll b) {return a<b;}int main() { scanf("%lld",&n);ll t=ll(sqrt(double(n+1))); int len=0;for(int i=1;i<=t;i++)if(n%i==0){a[++len]=i;a[++len]=n/i;} sort(a+1,a+1+len,cmp);ll ans=0; for(int i=len;i>=1;i--) { f[i]=n/a[i];for(int j=i+1;j<=len;j++)if(a[j]%a[i]==0)f[i]-=f[j];ans+=f[i]*a[i]; }printf("%lld\n",ans); return 0;}
阅读全文
0 0
- [BZOJ2705][SDOI2012]Longge的问题(数论)
- bzoj2705: [SDOI2012]Longge的问题(数论)
- 【SDOI2012】【BZOJ2705】【Longge的问题】【题解】【数论】
- [杂题 数论] BZOJ2705: [SDOI2012]Longge的问题
- bzoj2705[SDOI2012]Longge的问题
- 【SDOI2012】【BZOJ2705】Longge的问题
- [BZOJ2705][SDOI2012]Longge的问题
- BZOJ2705: [SDOI2012]Longge的问题
- bzoj2705 [SDOI2012]Longge的问题
- BZOj2705: [SDOI2012]Longge的问题
- BZOJ2705 [SDOI2012]Longge的问题
- [BZOJ2705][SDOI2012]Longge的问题
- BZOJ2705: [SDOI2012]Longge的问题
- bzoj2705【SDOI2012】Longge的问题
- Longge的问题[SDOI2012][bzoj2705]
- BZoj2705: [SDOI2012]Longge的问题
- 【SDOI2012】bzoj2705 Longge的问题
- bzoj2705: [SDOI2012]Longge的问题
- 正则表达式
- JavaScript设计模式系列一:工厂模式
- py的函数及练习 12.21
- linux后台运行相关命令
- Springboot 中同时使用mybatis注解和springbean-xml配置方式
- bzoj2705: [SDOI2012]Longge的问题(数论)
- WebShell概述
- python2安装MySQLdb
- servlet--监听器
- 命令行参数
- 存储在变量 sys.argv 中
- Linux设备驱动之中断---基本代码框架
- 万树IT:如何提升Android水平
- 关于如何在程序中使用命令行参数