Test instructions: Constructs a string of length n so that, except for the first, the number of prefixes and factors in each position is exactly equal to the number at that position.
N$\le 100000$
For example $a_i$:2 4 6 6 4 8 4 8 4 8
Prefixes and: 6 12 18 22 30 34 42 46 54
Factor of 6:1 2 3 6 is 4 equals a[2]
Factor of 12:1 2 3 4 6 12 is 6 equals a[3]
Factor of 18:1 2 3 6 9 18 is 6 equals a[4]
...
...
Factor of 54:1 2 3 6 9 18 27 54 is 8 equals a[9]
All are satisfied, the column is legal
The first time I've been thinking about where it impossible
And then we're going to get violent and see where.
Then I found that I was writing it, and I couldn't write it.
So I found that the number of the number of factors written out, backwards to reduce back,
There is only one way to go back every number, the longest is the answer.
Like what
27 This number goes back to a length of 9
26 This number goes back to a length of 6
...
Each number goes back with a length
And then I found out just the number minus the number of factors. How long will it take to get back to +1?
Well, just preprocess the number of factors.
Just for once, O (1) can get the length
(For the and, the length is the title of the input n, need to output is the longest length of that string back to the number of factors on the road)
So make a table like this, just 1 seconds.
intphi[20000005];intpri () {memset (phi,0,sizeof(PHI)); for(intI=2; i<=2000000; i++) for(intj=i;j<=2000000; j+=i) phi[j]++;}intdp[20000005];voidPre () {memset (DP,0,sizeof(DP)); dp[1]=1, dp[2]=1; for(intI=3; i<=2000000; i++) { intnum=phi[i]+1;//if (num>300 | | dp[i-num]==-1)//Dp[i]=-1;//Elsedp[i]=dp[i-num]+1;//printf ("%d%d\n", I, Dp[i]); if(dp[i]>=100000) {printf ("%d%d\n", I, dp[i]); Break; } }}intMain () {//freopen ("OUT.txt", "w", stdout);pri (); Pre (); return 0;}
The resulting 1568617 is the last number of N for 100000.
To get the n number, it's good to go backwards.
1#include <bits/stdc++.h>2 using namespacestd;3typedefLong LongLL;4typedef pair<int,int>PI;5 Const intn=1e5+5;6 Const Doubleeps=1e-5;7 Const intmod=1e9+7;8 9 intans[100005], D;Ten intphi[1568625]; One voidPre () A { -Memset (PHI,0,sizeof(PHI)); - for(intI=2; i<=1568617; i++) the for(intj=i;j<=1568617; j+=i) -phi[j]++; - intx=1568617; -D=0; + while(x) - { +ans[d++]=x; A intnum=phi[x]+1; atx-=num; - } - } - - intMain () - { in pre (); - intN; to while(~SCANF ("%d",&N)) + { - intsum=0; the for(inti=d-1, j=1; j<=n;j++, i--) * { $printf"%d", ans[i]-sum);Panax Notoginsengsum=Ans[i]; - if(j==N) thePuts""); + Else APutchar (' '); the } + } - return 0; $}
Ural 2047
[Miscellaneous Questions] URAL2047. Maths