In a div2 only round, when the person with rating 2099 is the first, he jumps 200 points or more. However, if he is 2100, he does not get anything. Therefore, I suggest a gradual division boundary. First, we calculate the standing including every person that his rating could change and calculate the rating.
In div2, if his rating is lower than 2000, it is fully rated for him. If his rating is between 2000 and 2200, he would get ratingchange*(2200-rating)/200 ratings. If his rating is greater than 2200, he is unrated and doesn't include in the standings. Same thing for div3 and div4, with different bound. However, I think it should not be done in div1+2 separated round since 1900 could just join div1.
This algorithm seems like it would have big problems with consistency as described in the Codeforces rating description. In particular 1999 people could perform worse than 2000 people but have much better rating changes.
Originally, 2099 become 2300, 2100(better than 2099) become 2100 With this, 2099 become 2200, 2100(better than 2099) become 2200. The original system has more problems in consistency.
I missed that you scaled the multiplier linearly; I should have read more carefully. I guess it would probably be good if CF added this. But any rating system is going to have jumps and people varying above and below their "true rating".
Probably the rating system could be improved more with a large scale overhaul though.