纷菲幻剑录 之 十年一剑
2016-07-30 10:41
211 查看
题目又臭又长.直接给链接了
HDU2248
第二个问题Stones:有n个数组成的序列(3<=n<=20000),取其中连续的h个数,使得这h个数的和对n取余为0,要求h尽量小,坐标尽量小;
第三个问题Search:输入两个数x,k,求x的第k小素数,没有输出no。例如x=48,k=6. 48分解的{2,2,2,2,3} 所以1-4大素因子都是2,第5大是3,比5大则没有。质因数x即可;(1<=x<6400000 && 0
题目二:也好解决,最容易想到的就是两层for循环,依次扫描知道找到最小的h,当然还有一种方法可以在0(n)时间复杂度内解决
题目三:对x进行素因子分解就行
题目四: 自己写的大数模板+快速幂一直TLE.于是从网上找了套大数重载运算的模板套上去,AC,yeah!
HDU2248
题目大意:
第一个问题Swords:输入一个整数num,数字全部由1组成,保证数字长度小于一百,判断num的位数是不是素数;第二个问题Stones:有n个数组成的序列(3<=n<=20000),取其中连续的h个数,使得这h个数的和对n取余为0,要求h尽量小,坐标尽量小;
第三个问题Search:输入两个数x,k,求x的第k小素数,没有输出no。例如x=48,k=6. 48分解的{2,2,2,2,3} 所以1-4大素因子都是2,第5大是3,比5大则没有。质因数x即可;(1<=x<6400000 && 0
思路:
题目一:好解决,素数打表100以内的素数就行题目二:也好解决,最容易想到的就是两层for循环,依次扫描知道找到最小的h,当然还有一种方法可以在0(n)时间复杂度内解决
题目三:对x进行素因子分解就行
题目四: 自己写的大数模板+快速幂一直TLE.于是从网上找了套大数重载运算的模板套上去,AC,yeah!
Code
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> #define M 20005 #define Max 6400005 const int inf=0x7FFFFFFF; #define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 using namespace std; bool isPrime[Max]; int prime[Max]; int dis[2]={4,2},total=0,pos=0; char str[5]; int k; void makeprime() { int i,j; prime[total++]=2; prime[total++]=3; for(i=5;i<=Max;i+=dis[pos^=1]) { if(!isPrime[i]) prime[total++]=i; for(j=0;j<total&&i*prime[j]<=Max;++j) { isPrime[i*prime[j]]=true; if(i%prime[j]==0) break; } } } class BigNum { private: int a[100000]; //可以控制大数的位数 int len; //大数长度 public: BigNum(){ len = 1;memset(a,0,sizeof(a)); } //构造函数 BigNum(const int); //将一个int类型的变量转化为大数 BigNum operator*(const BigNum &) const; //重载乘法运算符,两个大数之间的相乘运算 BigNum operator^(const int &) const; //大数的n次方运算 void print(); //输出大数 }; BigNum::BigNum(const int b) //将一个int类型的变量转化为大数 { int c,d = b; len = 0; memset(a,0,sizeof(a)); while(d > MAXN) { c = d - (d / (MAXN + 1)) * (MAXN + 1); d = d / (MAXN + 1); a[len++] = c; } a[len++] = d; } BigNum BigNum::operator*(const BigNum & T) const //两个大数之间的相乘运算 { BigNum ret; int i,j,up; int temp,temp1; for(i = 0 ; i < len ; i++) { up = 0; for(j = 0 ; j < T.len ; j++) { temp = a[i] * T.a[j] + ret.a[i + j] + up; if(temp > MAXN) { temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); up = temp / (MAXN + 1); ret.a[i + j] = temp1; } else { up = 0; ret.a[i + j] = temp; } } if(up != 0) ret.a[i + j] = up; } ret.len = i + j; while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; return ret; } BigNum BigNum::operator^(const int & n) const //大数的n次方运算 { BigNum t,ret(1); int i; if(n==0) return 1; if(n==1) return *this; int m=n; while(m>1) { t=*this; for( i=1;i<<1<=m;i<<=1) { t=t*t; } m-=i; ret=ret*t; if(m==1) ret=ret*(*this); } return ret; } void BigNum::print() //输出大数 { int i; cout << a[len - 1]; for(i = len - 2 ; i >= 0 ; i--) { cout.width(DLEN); cout.fill('0'); cout << a[i]; } cout << endl; } int main() { makeprime(); while(scanf("%s",str)!=EOF) { getchar(); if(strcmp(str,"Swords")==0) { char s[105]; memset(s,0,sizeof(s)); gets(s); for(int i=0;;++i) { if(prime[i]==strlen(s)) { cout<<"Yes."<<endl; break; } else if((prime[i]>strlen(s))) { cout<<"No."<<endl; break; } } } else if(strcmp(str,"Stones")==0) //(3 <= n <= 20000) { int n,i,j; int num[M],f[M],len=inf,p=0,begin=0; memset(f,-1,sizeof(f)); f[0]=0; scanf("%d",&n); for(i=1;i<=n;++i) { scanf("%d",&num[i]); p=(p+num[i])%n; if(f[p]!=-1) { if(i-f[p]<len) { len=i-f[p]; begin=f[p]+1; } } f[p]=i; } if(len==inf){ printf("可怜的亦纷菲!\n");continue;} for(i=begin;i<begin+len;++i) { if(i!=begin) printf(" "); printf("%d",i); } printf("\n"); continue; } else if(strcmp(str,"Search")==0) //(1<=x<6400000 && 0<k<=2^31-1); { int num[100]; memset(num,0,sizeof(num)); int x,i=0,ant=0; scanf("%d%d",&x,&k); bool flag=false; while(x>1) { while(x%prime[i]==0) { x/=prime[i]; k--; if(k==0) { flag=true; printf("%d\n",prime[i]); break; } } if(flag) break; i++; } if(!flag) cout<<"no"<<endl; } else { int n; scanf("%d",&n); BigNum ans(2); ans=ans^n; ans.print(); } } //cout << "Hello world!" << endl; return 0; }
相关文章推荐
- poj 1094 topo 在线处理数据
- 表空间的管理
- Hello World, Perl
- cocos引用iconv库在android编译,错误undefined reference libiconv_open,libiconv_close
- CSS 选择器、jQuery选择器大全
- 实习点滴 - 跟一个蠢bug学习多线程调试、线程安全和可重入函数
- 对两个整数变量的值进行互换(不需要第三方变量)
- PyQt5教程-04-关闭窗口
- 权限管理——权限模型和权限控制
- js 字符串转换成int或者float类型
- 详解 CSS 属性 - 伪类和伪元素的区别
- int和short int 区别
- 详解js中的apply与call的用法
- C++中输出入门级格式:前补0以及精确度
- Python操作memcached及redis
- 用jquery怎么删除<table>的一行
- scala学习手记28 - Execute Around模式
- 一句话轻松搞定asp.net分页
- ngResource模块的使用
- 最有效率的方式算出2乘以8等于几?