一个正整数。
输出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列
6 种状态为:(000)(001)(011)(100)(110)(111)
求一个连续数和为N的数,
运用数学等差数列的基本方法
思考:利用数列最长的长度n:(1+n)*n/2=连续数和,那么可以枚举数列长度
1.枚举数列长度n,根据(a1+a1+n)*n/2=连续数和,求出a1
2.将数列存储到一个结构体中,结构体成员有数列的第一个数a1,数列字符串
3.由于需要字典序最小,又因为每一个数列的a1不同,那么就可以比较a1来进行排序
#include<math.h> #include<stdio.h> #include<stdlib.h> #include<iostream> #include<algorithm> #define LL long long #define FORa(i,s,e) for(LL i=s;i<=e;i++) #define FORs(i,s,e) for(LL i=s;i>=e;i--) #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,10000,stdin),pa==pb)?EOF:*pa++ #define File(name) freopen(name".in","r",stdin),freopen(name".out","w",stdout) using namespace std; static char buf[10000],*pa=buf,*pb=buf; inline LL read(); LL n,cnt,ct; struct Node{ string s; int a1; }s[50000]; string Turn_s(int x) { string fs; fs.clear(); while(x) { fs=char((x%10)+‘0‘)+fs; x/=10; } return fs; } bool cmp(Node a,Node b) { return a.a1<b.a1; } int main() { File("num"); n=read(); cnt=-1+ceil(sqrt(4+8*n)/2); FORa(i,2,cnt) { if((2*n+i-i*i)%(2*i)==0) { LL a1=(2*n+i-i*i)/(2*i); s[++ct].s=Turn_s(a1),s[ct].a1=a1; FORa(j,2,i) s[ct].s=s[ct].s+" "+Turn_s(a1+j-1); } } sort(s+1,s+1+ct,cmp); if(ct==0) printf("NONE"); else FORa(i,1,ct) cout<<s[i].s<<endl; return 0; } inline LL read() { register LL x(0);register LL f(1);register char c(gc); while(c<‘0‘||c>‘9‘) f=c==‘-‘?-1:1,c=gc; while(c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=gc; return x*f; }
照搬应试策略
模拟方法:
照搬应试方法
因数分解方法:
1.设L,R,则S=(L+R)*(R-L+1)/2
2.那么 2S=(L+R)*(R-L+1)
3.将2S分解为两个因数的乘积形式,求出L,R
1.数列的基本运算
2.因数分解思想
原文:https://www.cnblogs.com/SeanOcean/p/11172498.html